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 的转换,并且区域设置没有问题)。
我有一个带有 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 的转换,并且区域设置没有问题)。