java - 使用 Java 和 JDBC 将无符号 64 位数字插入 BigInt MySQL 列

标签 java mysql jdbc unsigned

我搜索了这个问题的答案,但只找到了模糊的答案。问题是这样的: 我在 MySQL 中有一个示例表: 我的表 时间 时间戳 数据 BigInt(20) 无符号

选择数据字段,使其可以接受 2^64 最大值:18446744073709551616(20 位数字,因此为 BigInt(20))。

我有一个 csv 文件,其中包含无符号 64 位整数。

现在我使用 Java 和 JDBC 插入此数据并遇到问题,因为 Java 没有 unsigned long。所以我尝试只传递字符串 - 但失败了。

st = conn.prepareStatement("INSERT INTO pawan_table (mytime, data) VALUES(?, ?)");
st.setTimestamp(1, new Timestamp(86400000+i*1000));
st.setString(2, "18446744073709551616");
st.execute();

我还尝试了 Java 中的 BigInteger 类 - 但 JDBC 没有采用该类型的方法。我只能将 BigInteger 转换为带符号的“long”,但这不是我想要的。例如:

BigInteger bi = new BigInteger(string_from_csv_file);
st.setLong(2, bi.longValue());

有趣的是 MySQL Workbench 可以插入这些数据 - 但它是用 C# 编写的!我需要用 Java 编写代码!

Java 程序员如何在 MySQL BigInt(20) 列中插入无符号 64 位数字?

最佳答案

所以这是解决方案:

如果您不使用准备语句而只是使用字符串 SQL 语句插入,则无需担心,因为 JDBC 只是将您的语句移动到 MySQL 服务器,并且 MySQL 服务器可以正确地将字符串解析为无符号 64 数字(BigInt- 20).

如果您使用准备语句,那么您就有麻烦了。如果您这样做:

BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setObject(2, bi, Types.BIGINT);
statement.execute();

您将收到 MySqlDataTruncation 异常,因为 JDBC 想要将其截断为有符号长整型。

如果你这样做:

BigInteger bi = new BigInteger(new Long(Long.MAX_VALUE).toString());
statement.setObject(2, bi, Types.BIGINT);
statement.execute();

这会起作用,因为该值在 Java 的有符号长整型范围内。

因此始终有效的解决方法是:

BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setString(2, bi.toString());
statement.execute();

您最终将数据作为字符串传递,并让 MySQL 服务器正确解析它。

有人应该修复 JDBC 驱动程序,因为许多统计应用程序中不断出现无符号 64 位数字。

关于java - 使用 Java 和 JDBC 将无符号 64 位数字插入 BigInt MySQL 列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15240049/

相关文章:

java方法同步和读/写互斥

java - 重新画一个正方形?

mysql - 从多个文件输入读取 JSON 数据

java - 直接将结果集插入jtable

java - 无法转换为内部表示 JDBC

java - 日志 : log4j or lucene?

java - 预期的方法调用

mysql - 将图像从数据库添加到谷歌地图信息窗口

mysql - INNER JOIN 的查询优化

java - 如何将 JComboBox 事件处理程序的字符串放入变量中进行查询?