PostgreSQL:十进制/数字数据类型上的数字字段溢出 - 为啥会出现此错误
Posted
技术标签:
【中文标题】PostgreSQL:十进制/数字数据类型上的数字字段溢出 - 为啥会出现此错误【英文标题】:PostgreSQL: Numeric field overflow on decimal / numeric Data Type - Why does it gives this ErrorPostgreSQL:十进制/数字数据类型上的数字字段溢出 - 为什么会出现此错误 【发布时间】:2021-09-19 13:36:47 【问题描述】:我创建一个这样的表
CREATE TABLE foo (
id serial CONSTRAINT id_pk PRIMARY KEY,
bar varchar(256),
test decimal(5,5)
);
然后我想填充test
列
INSERT INTO foo (test) VALUES (12345.12345)
这给了我
数值字段溢出 详细说明:精度为 5、比例为 5 的字段必须四舍五入到小于 1 的绝对值。
我不明白这一点。不过,如果我将一列设置为decimal(5,5)
,我必须在逗号左侧有五位数字,在逗号右侧有五位数字。我的号码是12345.12345
。
为什么会出现这个错误?
【问题讨论】:
因为小数精度不是你想的那样。第一个数字是小数位数的总数,而不是分隔符之前的位数。你想要decimal(10, 5)
。
试试DECIMAL(10,5)
。逗号左边的参数是总长度,右边的参数是小数位数。
psql
标签指的是命令行工具,此处无关。请不要添加
【参考方案1】:
您误解了指定小数的工作原理(我同意这有点令人困惑)。
Quote from the manual
数值的精度是整数中有效位数的总数,即小数点两边的位数。数字的小数位数是小数部分的小数位数,在小数点右侧
所以第一个数字定义总位数,第二个定义小数位数。
如果要小数点前5位,小数点后5位,需要使用decimal(10,5)
【讨论】:
@Stophface 。 . .只是强调一下:这就是 SQL 定义规模和精度的方式,所以它在所有数据库中都是这样工作的,而不仅仅是 Postgres。以上是关于PostgreSQL:十进制/数字数据类型上的数字字段溢出 - 为啥会出现此错误的主要内容,如果未能解决你的问题,请参考以下文章