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

来源:互联网 发布:smali语言编程 编辑:程序博客网 时间:2024/06/07 03:16

有一个表:

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;

Numeric value out of range: "59259600000"; SQL statement:
SELECT * FROM ASSET where TIMESTAMP = 16461*1000*60*60*24 [22003-176] 22003/22003 (Help)
59259600000溢出了,怎么回事?

单独试一下

select 16461*1000*60*60*24;

Numeric value out of range: "59259600000"; SQL statement:
select 16461*1000*60*60*24 [22003-176] 22003/22003 (Help)

还是溢出,看来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,不知道后续版本是否有相同的问题。

0 0
原创粉丝点击