插入查询中的数字溢出

时间:2015-08-25 11:30:11

标签: firebird firebird2.5

我收到错误:

  

发生了算术溢出或除零。算术   异常,数字溢出或字符串截断。数值是   超出范围。

这可以复制:

create table testing (avalue numeric(3,2));

以及以下插页:

insert into testing values (328);

但是,使用以下工作正常:

insert into testing values (327);

328似乎是错误发生的神奇数字。对我来说,numeric(3,2)声明应该允许我000-999,小数点后2位,但基于上面的错误。

有人可以解释为什么这是我应该声明我的域名,好像我想允许0-999,小数点后2位。

由于

2 个答案:

答案 0 :(得分:4)

328不是"魔术"数:) 幻数是32767(0x7FFF)。这是SMALLINT类型限制。

注意:Firebird不支持无符号整数类型。

NUMERIC类型的限制因存储类型和比例而异。 根据精确度,内部存储类型为SMALLINTINTEGERBIGINT

精度型

1..4 - SMALLINT

5..9 - INTEGER

10..18 - BIGINT

所以

NUMERIC(3,2)SMALLINT内部类型max 32767/100 = 327.67。

<强>更新

Firebird 2.5 Language Reference 通过 Paul Vinkenoog, 德米特里耶曼诺夫和 Thomas Woinke

包含比其他官方Firebird文档更全面的NUMERIC类型描述。

  

NUMERIC(精度,比例)是带小数的确切数字   由and和。

指定的精度和比例      

<强>语法:        NUMERIC [precision [,scale]]

     

NUMERIC的比例是小数位数   小数部分,小数点右侧。精度   NUMERIC是数字中的小数位数。

     

精度必须为正,最大支持值为18。   比例必须为零或正,直到指定的精度。

     

如果省略比例,则隐含零值,因此   表示指定精度的整数值,即   NUMERIC(P)相当于NUMERIC(P,0)。如果既精确又   省略比例,然后隐含9和零刻度的精度,   即NUMERIC相当于NUMERIC(9,0)。

     

NUMERIC数据类型的内部表示可能有所不同。   始终存储精度高达(包括)4的数字   缩放短整数(SMALLINT)。数字精度高达   (和包括)9总是存储为缩放的常规整数   (整数)。存储更高精度的数字取决于SQL   方言。在方言3中,它们被存储为缩放的大整数   (BIGINT)。但是,在方言1中,没有大整数,   因此它们存储为双精度浮点值   (双精度)。

     

给定值的有效精度限制取决于   相应的存储。例如,NUMERIC(5)将存储为   INTEGER,因此允许精度范围内的值达到(和   包括)NUMERIC(9)。 请注意声明的精度不是   严格执行

     

超出有效精度限制范围的值不是   允许。比例大于声明的值的值将是   在执行作业时四舍五入到声明的比例。

答案 1 :(得分:2)

声明numeric(5, 2)为您提供0.00到999.99之间的数字。声明numeric(3,2)为您提供从0.00到9.99的数字。这有点说明here。但这些是SQL中数字的标准声明。

&#34; 3&#34;是比例,它是数字中的总位数,而不是小数点左边的数字。

我不确定为什么允许327。