Mysql DOUBLE 列数据截断异常使用 Java Double

Mysql DOUBLE column data truncated exception using Java Double

我有一个带有 Double 数据类型列的 MySQL table,当我插入包含在 Java Double 中的值时,我总是遇到截断错误。

Mrz 19, 2015 11:26:00 AM databaseimport.MyImport executeQuery SCHWERWIEGEND: null java.sql.SQLException: Data truncated for column 'SHARE' at row 1

我尝试使用 DOUBLE PRECISION(30,30) 将列更改为更高的精度,这似乎是 DOUBLE 的最大值,但错误仍然存​​在。

这里是示例片段:

Double share = (Double) shareRow.get("share");

sql = ("INSERT INTO `SHARE_VALUES` (`ID`, `SHARE`)" +
       "VALUES (NULL, "+share+");");
try
        {
            // Create a Preparedstatement
            PreparedStatement ps;
            ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
            ps.execute();
            ResultSet generatedKeys = ps.getGeneratedKeys();

        }
        catch (SQLException ex)
        {
            java.util.logging.Logger.getLogger(Shares.class
                    .getName()).log(Level.SEVERE, null, ex);

            return -1;
        }

尝试这样做:

sql = String.format(Locale.US, "INSERT INTO `SHARE_VALUES` (`ID`, `SHARE`)" +
       "VALUES (NULL, %.3f);", share);

连接字符串时 java 可能会使用您的区域设置将例如 6.80 转换为“6,80”<- 逗号 (',') 符号对于 MySQL 具有不同的含义肯定会引起很多问题。

如果你打算使用准备好的语句,那么这会更像它:

NumberFormat nf = NumberFormat.getInstance(Locale.getDefault());    
Double share = nf.parse(shareRow.get("share")).doubleValue();

sql = ("INSERT INTO `SHARE_VALUES` (`ID`, `SHARE`)" +
       "VALUES (NULL, ?);");
try
{
    // Create a Preparedstatement
    PreparedStatement ps;
    ps = connection.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS);
    ps.setDouble(1, share);
    ps.execute();
    ResultSet generatedKeys = ps.getGeneratedKeys();

}
catch (SQLException ex)
{
    java.util.logging.Logger.getLogger(Shares.class
            .getName()).log(Level.SEVERE, null, ex);

    return -1;
}

注意查询字符串带有“?”标志,这些表示参数。当你打电话时:

ps.setDouble(1, share);

这将指定参数 1 的值为 share,因此第一个“?”符号被 share 的值替换(完全意识到 java 到 mysql 的转换,并且区域设置没有问题)。