h2 DB的一个问题,关于类型--Numeric value out of range

有一个表:

CREATE TABLEASSET(
    ASSET NUMERIC ,
    REAL NUMERIC ,
    TIMESTAMP NUMERIC ,
    TIMESTRING VARCHAR(100)
)

其中的TIMESTAMP NUMERIC 类型,实际存放的是UNIX Time,

可是有一次在做查询时发现一个问题:


SELECT * FROM ASSET where TIMESTAMP = 16461*1000*60*60*24;

59259600000溢出了,怎么回事?

单独试一下

select 16461*1000*60*60*24;

还是溢出,看来16461*1000*60*60*24就不行啊,但是这个是完全没有问题的,再试:

select 1422253516184/1000/60/60/24;

16461  
16461
(1 row, 1 ms)

这个可以,怎么回事?

为什么除可以,乘法就不可以?

再试一下:

select 1422253516184/1422253516184*16461*1000*60*60*24;

1422230400000  
1422230400000
(1 row, 0 ms)


竟然可以了,相信到这里大家也明白了,h2默认使用第一个变量的类型储存结果,越算越大就溢出了,如果初始化一个大类型,则可以解决此问题。


再实际查询一下:

SELECT * FROM ASSET where TIMESTAMP = 1422253516184/1422253516184*16461*1000*60*60*24;

ASSET   REAL   TIMESTAMP   TIMESTRING  
(no rows, 1 ms)


果然OK。


我用的h2是1.3.176,不知道后续版本是否有相同的问题。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值