使用适用于BigQuery的Simba JDBC驱动程序将BigDecimal值插入NUMERIC列时,为什么数字精度会丢失?

时间:2019-06-08 14:10:44

标签: jdbc google-bigquery simba

使用带有绑定变量的JDBC准备的语句将BigDecimal值插入NUMERIC列时,十进制分数将丢失。另一方面,如果不使用bind变量,则保留小数部分。

create table DS_TEST.BIGDECIMAL_TEST (NUMERIC_COL numeric)
String connectionString = "jdbc:bigquery://${host}:${port};ProjectId=${projectId};OAuthType=${OAuthType};OAuthServiceAcctEmail=${OAuthServiceAcctEmail};OAuthPvtKeyPath=${OAuthPvtKeyPath}"
Class.forName("com.simba.googlebigquery.jdbc42.Driver").newInstance()
Connection connection = DriverManager.getConnection(connectionString)

// insert statement without bind variable
PreparedStatement preparedStatement = connection.prepareStatement
    ("insert into `${projectId}`.DS_TEST.BIGDECIMAL_TEST (NUMERIC_COL) values (123.45)")
preparedStatement.executeUpdate()

// insert statement using bind variable
preparedStatement = connection.prepareStatement
    ("insert into `${projectId}`.DS_TEST.BIGDECIMAL_TEST (NUMERIC_COL) values (?)")
preparedStatement.setBigDecimal(1, new BigDecimal("567.89")) 
preparedStatement.executeUpdate()
preparedStatement.close() 

我期望输出:

+-------------+
| NUMERIC_COL |
+-------------+
| 123.45      |
| 567.89      |
+-------------+

但实际输出是

+-------------+
| NUMERIC_COL |
+-------------+
| 123.45      |
| 567         |
+-------------+

这是错误还是我错过了什么?

1 个答案:

答案 0 :(得分:1)

我的BigDecimal值也被四舍五入,因此我能够复制您的方案。不过,在深入研究之后,我发现有一个issue reported,其中传递给PreparedStatement的BigDecimal值被舍入到最接近的整数。我建议对其subscribing进行跟踪。解决方法是使用:

PreparedStatement preparedStatement = connection.prepareStatement
    ("insert into `${projectId}`.DS_TEST.BIGDECIMAL_TEST (NUMERIC_COL) values (123.45)")
preparedStatement.executeUpdate()

您已经在做

希望有帮助。