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

时间:2016-08-08 13:17:16

标签: java mysql jdbc

根据MySQL docs Unsinged Bigint 的最大值= 18446744073709551615

我在未加工的Bigint列中插入了值9223372036854776900(远低于最大限制)。

未显示错误。

当我尝试通过JDBC客户端以编程方式访问它时,我得到了例外:

  

com.mysql.jdbc.exceptions.jdbc4.MySQLDataException:'10'列中的'9223372036854776900'超出了数据类型BIGINT的有效范围。       at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)       at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)       at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)       at java.lang.reflect.Constructor.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)       at 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

3 个答案:

答案 0 :(得分:3)

根据堆栈跟踪的建议,当我尝试使用ResultSet#getLong

时,我能够重新创建您的问题
Long l = rs.getLong(1);

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

但是,我能够使用

成功地将值检索为BigDecimal
java.math.BigDecimal bd = rs.getBigDecimal(1);

或使用

作为BigInteger
java.math.BigInteger bi = (java.math.BigInteger) rs.getObject(1);

答案 1 :(得分:1)

BIGINT的最大值为9223372036854775807。

来自Oracle文档(Mapping SQL and Java Types

  

8.3.7 BIGINT JDBC类型BIGINT表示介于-9223372036854775808和9223372036854775807之间的64位有符号整数值。

     

相应的SQL类型BIGINT是SQL的非标准扩展。   实际上,SQL BIGINT类型目前尚未实现   任何主要数据库,我们建议避免使用它   在可移植的代码中。

     

BIGINT类型的推荐Java映射是Java long。

有一个解决方案发布到另一个可能对您有用的问题:Inserting unsigned 64-bit number into BigInt MySQL column using Java and JDBC

答案 2 :(得分:1)

您可以在下面的网站http://www.mysqlab.net/knowledge/kb/detail/topic/java/id/4929

中找到您的回复
  

表A.2。无符号类型映射     

    Data TypeJava Type 
    TINYINT UNSIGNED      java.lang.Integer
    SMALLINT UNSIGNED     java.lang.Integer
    MEDIUMINT UNSIGNED    java.lang.Long
    INT UNSIGNED          java.lang.Long
    BIGINT UNSIGNED       java.math.BigInteger
注意:在MySQL之前   Connector / J 3.1.3,BIGINT UNSIGNED映射到java.math.BigDecimal。