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:十进制/数字数据类型上的数字字段溢出 - 为啥会出现此错误的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL数据类型(中文手册)

PostgreSQL - 从双精度字段中获取所有整数数字以用于 to_char 函数

postgresql数字类型

没有精度的Oracle数字类型 - 我怎么知道它是否是整数

sql 数字数据类型,数字,十进制,浮点数

PostgreSQL 数据类型