我收到错误:
发生了算术溢出或除零。算术 异常,数字溢出或字符串截断。数值是 超出范围。
这可以复制:
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位。
由于
答案 0 :(得分:4)
328不是"魔术"数:)
幻数是32767(0x7FFF)。这是SMALLINT
类型限制。
注意:Firebird不支持无符号整数类型。
NUMERIC
类型的限制因存储类型和比例而异。
根据精确度,内部存储类型为SMALLINT
,INTEGER
和BIGINT
:
精度型
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。