gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 05:30:32 25 4
gpt4 key购买 nike

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

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

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

现在我使用 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 位数字?

最佳答案

解决方法如下:

如果你不使用 prepare 语句而只是使用字符串 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 想要将其截断为 signed long。

如果你这样做:

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

这会起作用,因为该值在 Java 的 signed long 范围内。

所以始终有效的解决方法是:

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com