我有一个带有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;
}
答案 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的转换,并且没有语言环境问题)。