【问题标题】:Issue with UNSIGNED BIGINT of MySQL while fetching using JDBC client使用 JDBC 客户端获取时 MySQL 的 UNSIGNED BIGINT 问题
【发布时间】:2016-12-14 06:58:39
【问题描述】:

根据MySQL docsUnsinged Bigint 的最大值 = 18446744073709551615

我在一个未签名的 Bigint 列中插入了一个值 9223372036854776900(远低于最大限制)。

没有显示错误。

当我尝试通过 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.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) 在 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

【问题讨论】:

  • MySQL、JDBC驱动、Java哪个版本?
  • @phn 5.1。这可能是这里的罪魁祸首吗?

标签: java mysql jdbc


【解决方案1】:

根据堆栈跟踪的建议,当我尝试使用 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);

【讨论】:

  • 显然 OP 确实调用了getLong。实际上是一个非常好的错误。
【解决方案2】:

您可以在以下网站表格中找到您的回复http://www.mysqlab.net/knowledge/kb/detail/topic/java/id/4929

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

 数据类型Java 类型
    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。

【讨论】:

    【解决方案3】:

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-19
      • 2015-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多