我搜索了这个问题的答案,但只找到了模糊的答案。问题是:我在MySQL中有一个示例表: mytable Timestamp data BigInt(20) unsigned
选择数据字段,以便它可以接受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工作台可以插入这些数据--但是它是用c#编写的!我需要用Java写我的代码!
程序员如何在MySQL BigInt(20)列中插入无符号64位数字?
发布于 2013-03-07 09:23:06
因此,以下是解决方案:
如果不使用prepare语句,而只是使用string SQL语句插入,则无需担心,因为JDBC只需将语句移动到MySQL服务器,MySQL服务器就可以正确地将字符串解析为无符号64位数字(BigInt-20)。
如果您使用prepare语句,那么您就有麻烦了。如果您这样做了:
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位数字一直出现在许多统计应用程序中。
发布于 2013-03-06 15:43:02
您也许可以使用PreparedStatement.setObject来实现这一点。有一个变体接受一个指定值类型的参数:您可以传入一个BigInteger和java.sql.Types.BIGINT,看看它是否有效。
如果失败,那么可以创建一个实现SQLData的帮助器类,并将其传递给setObject。
免责声明:我没有尝试过这些;它是基于对javadoc的快速浏览。
发布于 2015-08-27 04:59:06
如果数据类型是BIGINT UNSIGNED,则这适用于MySQL后端。
存储数字的工作方式如下:
PreparedStatement statement = conn.prepareStatement("INSERT INTO Speeds (downSpeed) VALUES (?)");
statement.setObject(1, spd.downSpeed, Types.BIGINT);检索使用原始的getObject()调用:
BigInteger downSpeed = (BigInteger) rs.getObject("downSpeed");我尝试使用rs.getObject("downSpeed",BigInteger.class),但这给了我一个不支持的转换错误。
注意,可以存储在BIGINT UNSIGNED类型中的最大数字是1.8 *10^9。请参阅此处:MySQL DataTypes
https://stackoverflow.com/questions/15240049
复制相似问题