插入64位无符号数为BigInt有MySQL的列使用Java和JDBC(Inserting unsi

2019-07-21 01:32发布

我寻找这个问题的答案,只发现含糊不清的答案。 这里的问题是:我在MySQL一个示例表:MYTABLE时间时间戳数据BigInt有(20)无符号

被选择的数据字段,以便它可以在2 ^ 64最大值:18446744073709551616(20个数字,因此BigInt有(20))。

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

现在,我使用Java和JDBC插入此数据并运行到问题,因为Java没有无符号长。 于是,我只是路过字符串 - 但它失败。

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

我也尝试过的BigInteger类在Java中 - 但是JDBC没有这需要该类型的方法。 我只能转换的BigInteger到签署,这是不是我想要什么“长”。 例如:

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

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

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

Answer 1:

因此,这里的解决方案:

如果你不使用准备语句和使用字符串SQL语句只是插入,你有什么好担心的,因为JDBC只是移动你的语句MySQL服务器和MySQL服务器可以正确解析字符串为unsigned 64号(BigInt有-20)。

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

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

因为JDBC要截断为签署长,你会得到一个MySqlDataTruncation例外。

如果你这样做:

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位无符号数保持在一个大量的统计应用上来。



Answer 2:

您可能能够达到这一点使用PreparedStatement.setObject 。 还有就是接受一个参数指定值的类型的变体:你可以传递一个BigIntegerjava.sql.Types.BIGINT ,看看是否可行。

如果失败,那么你可以创建一个实现一个辅助类SQLData并传递给setObject

免责声明:我没有尝试过的这一点; 它是基于关闭快速浏览一下的javadoc。



Answer 3:

这工作与MySQL后端,如果数据类型为BIGINT UNSIGNED。

存放数以这种方式工作:

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



文章来源: Inserting unsigned 64-bit number into BigInt MySQL column using Java and JDBC