此错误消息指的是什么数据类型?
ERROR: numeric field overflow DETAIL: A field with precision 1, scale 0 must round to an absolute value less than 10^1.
我收到上面列出的错误,它来自插入触发器。由于我的数据类型都没有明确定义为NUMERIC(1,0)
,并且最大值是 10 的 1 次方(即 10),我猜这个错误实际上是指一个BOOLEAN
字段。但是,我找不到对此的确认。
更新
解决。我的触发器正在尝试将一些字符串解析为数字。当to_number()
未获得预期格式的字符串时,将返回列出的错误。
这将返回 1.4(正确)-
select to_number('1.4','9D9');
这将返回上述错误
select to_number('1d4','9D9');
仍然不太清楚它为什么抱怨,NUMERIC(1,0)
但至少我知道为什么会出现错误。
那是因为
to_number()
从输入字符串中删除了除数据字符之外的任何内容。数据字符有:数字、符号、小数点和逗号。不过,噪声字符并非无关紧要,因为它们仍然计入格式模式的长度。所以:实际上与以下内容相同:
两者都失败了,因为该模式
'9D9'
只允许逗号前有一个数字。但是这个有效的表达:
不一样:
过多的噪音会截断输入。
db<>在这里摆弄
而且,是的,是模式字符串(第二个函数参数)中
D
小数点(独立于语言环境)的格式说明符,但不是输入字符串(第一个函数参数)。你自己已经发现了。为了解决标题中的问题 - Postgres在手册中有一个定义:
也就是说,我在这里看到两个 Postgres 问题:
1. 缺少文件
手册中
to_number()
没有记录忽略输入中的非数据字符。也不是那些仍然计入模式的总长度。2.错误信息中的Bug
错误信息的DETAIL中似乎有错误。观察到:
真的应该是:
效果是一样的,所以行为是连贯的。但这些信息具有误导性。