db2 - 一个bigint问题

一个bigint问题

db2 => values bigint ( 23 * 1000000 )

1
--------------------
23000000

1 record(s) selected.

db2 => values bigint ( 23 * 100000000 )
SQL0802N Arithmetic overflow or other arithmetic exception occurred.
SQLSTATE=22003
db2 => values bigint ( 23 * 1000000000 )
SQL0802N Arithmetic overflow or other arithmetic exception occurred.
SQLSTATE=22003
db2 => values bigint ( 23 * 10000000000 )

1
--------------------
230000000000

1 record(s) selected.

第一个和第四个都正常,为什么中间两个不正常,会溢出?


>>>>


因为对于第一组数据的1000000  DB2将其当作int,得出的结果也是在interger能表达的范围内。
第二组及第三组的1xxxx本身都在interger能表示的范围内,所以DB2也当他们是int,但是算出来的结果需要bigint才能表示。即在bigint这个scalar function生效前这个计算结果已经算术溢出了。
第四组数据的10000000000,由于其在bigint表示范围,因此db2将其作为bigint。而结果也是bigint能表示的范围,因此也不会出错。

所以可以说你的bigint scalar function没用对地方。values时是不用scalar function都能表达的,关键是要让运算不产生算术溢出。所以应该是:
values (23 * bigint(1xxxxxxxxx0))

这样明确的cast成bigint,db2就会用bigint的方式去存储运算结果了。


FROM: http://bbs.chinaunix.net/thread-1010685-1-1.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值