【问题标题】:Convert large string to bigInteger and pass it to prepared statement将大字符串转换为 bigInteger 并将其传递给准备好的语句
【发布时间】:2015-03-12 11:51:51
【问题描述】:

我有这个字符串说reference = '2039487894563827398440987'

我正在尝试通过执行类似的操作将其转换为 BigInteger

def reference = new BigInteger(reference)

然后在准备好的语句中我将其设置为

ps.setLong(reference);

我在其上映射此值的数据库column(XYZ) 具有dataType BigInt(40)。但是当我执行语句时它显示异常:

SQLSTATEEXCEPTION: Out of range value of column `XYZ` at row 1

如何处理这种情况。

编辑:也试过setBigDecimal(reference);

【问题讨论】:

    标签: java groovy prepared-statement biginteger


    【解决方案1】:

    您的数字对于 MySQL BIGINT 列来说太大了。如果您阅读these docs - 您会看到 BIGINT 数据类型不能采用如此大的数字(最大值为 ±9223372036854775807 有符号,或 18446744073709551615 无符号)。请参阅 this answer 以更全面地查看文档 - 跨不同的服务器类型。

    如果您可以更改数据库中的类型,您可能需要考虑将其更改为 NUMERIC 字段,或者将数字存储为字符串,或者将其转换为字节数组并将其存储为二进制 blob。

    编辑:

    为了完整性 - 以防有人对 40BIGINT(40) 中的含义感到困惑。这几乎没有任何意义。它当然不会影响存储数字的大小——总是 8 个字节(64 位)。这是关于如何显示数字的数据库提示 - 即显示前 40 位数字。它可能会影响零填充 - 例如如果将值 1234567895 放入 BIGINT(5) 列,它们很可能会显示为 12345678900005。查看the docs 了解其他可用类型。

    请注意,BigInt 字段可以存储的最长数字是以 10 为基数的 20 位数字,因此 40 确实几乎没有任何意义。

    【讨论】:

    • 是的,我知道 BIGINT(40) 的事实。只是我想知道没有其他方法可以代替更改数据库中的数据类型
    • 我认为不是,基本上 - 因为 2039487894563827398440987 > 18446744073709551615 - 它不适合。如果要存储这么大的数字,则需要另一种数据类型。
    【解决方案2】:

    您可以使用 setBigDecimal() 代替 setLong()。

    【讨论】:

    • 可能值得注意的是,要使用 setBigDecimal,您需要将 BigInteger 转换为 BigDecimal,即 ps.setBigDecimal(new BigDecimal(reference));
    • @JRichardSnape 是的,我已经确定了。
    猜你喜欢
    • 2011-04-18
    • 2022-01-04
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 2017-12-07
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    相关资源
    最近更新 更多