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

时间:2015-03-19 10:49:36

标签: java mysql double floating-point-precision double-precision

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

  

Mrz 19,2015 11:26:00 AM databaseimport.MyImport executeQuery   SCHWERWIEGEND:null java.sql.SQLException:为列截断的数据   ' SHARE'在第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;
        }

1 个答案:

答案 0 :(得分:0)

尝试这样做:

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

当连接字符串时,java可能会使用你的语言环境来转换,例如将6.80转换为“6,80”&lt; - 逗号(',')符号对MySQL有不同的含义,这肯定会引起很多问题。< / p>

如果您打算使用预准备语句,那么这更像是:

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,因此第一个“?” sign被share的值替换(完全了解java到mysql的转换,并且没有语言环境问题)。