首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Java和JDBC在BigInt MySQL列中插入64位无符号数字

问用Java和JDBC在BigInt MySQL列中插入64位无符号数字
EN

Stack Overflow用户
提问于 2013-03-06 13:59:36
回答 3查看 8.8K关注 0票数 1

我搜索了这个问题的答案,但只找到了模糊的答案。问题是:我在MySQL中有一个示例表: mytable Timestamp data BigInt(20) unsigned

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

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

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

代码语言:javascript
复制
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“,这不是我想要的。例如:

代码语言:javascript
复制
BigInteger bi = new BigInteger(string_from_csv_file);
st.setLong(2, bi.longValue());

有趣的是,MySQL工作台可以插入这些数据--但是它是用c#编写的!我需要用Java写我的代码!

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

EN

回答 3

Stack Overflow用户

发布于 2013-03-07 09:23:06

因此,以下是解决方案:

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

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

代码语言:javascript
复制
BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setObject(2, bi, Types.BIGINT);
statement.execute();

您将得到一个MySqlDataTruncation异常,因为JDBC希望将其截断为signed long。

如果您这样做了:

代码语言:javascript
复制
BigInteger bi = new BigInteger(new Long(Long.MAX_VALUE).toString());
statement.setObject(2, bi, Types.BIGINT);
statement.execute();

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

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

代码语言:javascript
复制
BigInteger bi = new BigInteger("18446744073709551615"); // max unsigned 64-bit number
statement.setString(2, bi.toString());
statement.execute();

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

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

票数 3
EN

Stack Overflow用户

发布于 2013-03-06 15:43:02

您也许可以使用PreparedStatement.setObject来实现这一点。有一个变体接受一个指定值类型的参数:您可以传入一个BigInteger和java.sql.Types.BIGINT,看看它是否有效。

如果失败,那么可以创建一个实现SQLData的帮助器类,并将其传递给setObject。

免责声明:我没有尝试过这些;它是基于对javadoc的快速浏览。

票数 0
EN

Stack Overflow用户

发布于 2015-08-27 04:59:06

如果数据类型是BIGINT UNSIGNED,则这适用于MySQL后端。

存储数字的工作方式如下:

代码语言:javascript
复制
PreparedStatement statement = conn.prepareStatement("INSERT INTO Speeds (downSpeed) VALUES (?)");
statement.setObject(1, spd.downSpeed, Types.BIGINT);

检索使用原始的getObject()调用:

代码语言:javascript
复制
BigInteger downSpeed = (BigInteger) rs.getObject("downSpeed");

我尝试使用rs.getObject("downSpeed",BigInteger.class),但这给了我一个不支持的转换错误。

注意,可以存储在BIGINT UNSIGNED类型中的最大数字是1.8 *10^9。请参阅此处:MySQL DataTypes

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15240049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档