使用 JDBC 客户端获取 MySQL 的 UNSIGNED BIGINT 问题

dev*_*v ツ 5 java mysql jdbc

根据MySQL 文档Unsinged Bigint的最大值= 18446744073709551615

我在未标记的 Bigint 列中插入了一个值 9223372036854776900(远低于 max limit)。

没有显示错误。

当我尝试通过 JDBC 客户端以编程方式访问它时,出现异常:

com.mysql.jdbc.exceptions.jdbc4.MySQLDataException: '10' 列中的 '9223372036854776900' 超出数据类型 BIGINT 的有效范围。 在 sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 在 sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) 在 sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 在 java.reflect. .newInstance(Constructor.java:422) 在 com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 在 com.mysql.jdbc.Util.getInstance(Util.java:386) 在 com.mysql.jdbc。 SQLError.createSQLException(SQLError.java:1026) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987) 在 com.mysql.jdbc.SQLError.createSQLException(SQLError.java:982) 在 com.mysql.jdbc .SQLError.createSQLException(SQLError.java:927) 在 com.mysql.jdbc.ResultSetImpl.throwRangeException(ResultSetImpl.java:7964) 在 com.mysql.jdbc.ResultSetImpl.parseLongAsDouble(ResultSetImpl.java:7248) 在 com.mysql.jdbc.ResultSetImpl.getLong(ResultSetImpl.java:2946) 在 com.mysql.jdbc.ResultSetImpl.getLong(ResultSetImpl.java) :2911)


MySQL 版本:5.5.41-0ubuntu0.14.04.1

Gor*_*son 4

正如堆栈跟踪所建议的,当我尝试使用时,我能够重新创建您的问题ResultSet#getLong

Long l = rs.getLong(1);
Run Code Online (Sandbox Code Playgroud)

因为存储的值 9223372036854776900 大于 Java 中(有符号)的最大值Long:9223372036854775807。

但是,我能够使用 BigDecimal 成功检索该值

java.math.BigDecimal bd = rs.getBigDecimal(1);
Run Code Online (Sandbox Code Playgroud)

或作为 BigInteger 使用

java.math.BigInteger bi = (java.math.BigInteger) rs.getObject(1);
Run Code Online (Sandbox Code Playgroud)