问题描述
Postgresql中,输入以下sql语句查询时,报错ERROR: integer out of range
。参见postgresql数值类型,integer数据类型的最大值为2147483647,即2*1024*1024*1024。很明显,我们输入的整数溢出了。
select 10*1024*1024*1024;
问题解决
stackoverflow针对此问题的解决办法是修改列的类型为bigint,可我们的问题是溢出的整数位于查询语句而不是列中!
尝试进行类型转换,
select cast(10*1024*1024*1024 as bigint)
仍然报相同的错误,看来Postgresql默认将10*1024*1024*1024当作了integer型,我们还没来得及将其转换为bigint就溢出了。。。
这种情况下,我们可以首先计算出10*1024*1024*1024的值–10737418240,将其转为字符串,之后再转为bigint型即可。
-- 10737418240 = 10*1024*1024*1024
select cast(@H_403_51@'10737418240' as bigint)
更多
实际上在java中也有类似尴尬的问题,如下赋值较大数值给testLong时,因java默认10* 1024 * 1024 * 1024为整型。故也会出现数据溢出的错误。
Long testLong = 10* 1024 * 1024 * 1024;
将上述语句改为如下即可
Long testLong = 10* 1024 * 1024 * 1024L;