我正在使用PostgreSql 9.3和postgresql-9.3-1101 JDBC驱动程序。
PreparedStatements
有一个非常奇怪的行为。
以下是示例: 首先,我创建一个测试表:
CREATE TABLE double_test
(
id numeric(18) NOT NULL
);
之后我运行以下代码:
DecimalFormat df = new DecimalFormat("0");
try {
conn = BeanUtils.getBean("dataSource", DataSource.class).getConnection();
conn.setAutoCommit(false);
conn.createStatement().execute("DELETE from double_test ");
conn.commit();
PreparedStatement stmt = conn.prepareStatement("INSERT INTO double_test (id )VALUES (?)");
double input = 1234567890123456d;
System.out.println("Input:" + df.format(input));
stmt.setDouble(1, input);
stmt.execute();
conn.commit();
ResultSet rs = conn.createStatement().executeQuery("SELECT id FROM double_test ");
rs.next();
System.out.println("Output:" + df.format(rs.getDouble(1)));
rs.close();
} catch (SQLException e1) {
throw new RuntimeException(e1);
} finally {
try {
conn.close();
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
代码的输出将是:
Input: 1234567890123456
Output:1234567890123460
这让我非常困惑,在Postgres JDBC驱动程序开始回合15位之后。插入的数据已损坏,无需另行通知!
我在这里错过了什么吗?我的代码有错误吗?
或者这是驱动程序中的错误?如果是这样,我真的很想知道没有人注意到这一点。
也许使用BigDecimal
可以防止数据损坏,但这只是一种解决方法。