将大字符串转换为bigInteger并将其传递给预准备语句

时间:2015-01-14 10:17:18

标签: java groovy prepared-statement biginteger

我有这个字符串说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);

2 个答案:

答案 0 :(得分:1)

您可以使用setBigDecimal()而不是setLong()。

答案 1 :(得分: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实际上几乎没有任何意义。