PostgreSQL NUMERIC 类型 - 存储高精度的数字
本文介绍了 PostgreSQL 中的数字类型 NUMERIC。
PostgreSQL 提供了 NUMERIC 类型用来存储具有高精度要求的数字类型的数据,比如金额、里程、销量等。
对 NUMERIC 类型的值的计算通常比浮点类型慢,因此,如果对于精度没有要求,则应该使用浮点类型或者整数。
PostgreSQL NUMERIC 语法
这是 NUMERIC 类型的语法:
NUMERIC(precision, scale)
NUMERIC(precision)
NUMERIC
说明:
precision- 可选的。它是允许存储的数字的总位数,含小数部分的位数。
scale- 可选的。小数部分的位数。
例如,数字 1234.567 具有 precision 7 和 scale 3 。
注意, DECIMAL 和 NUMERIC 是等价的。
PostgreSQL NUMERIC 取值
NUMERIC 适用于存储含有大量数字的数值。它的小数点前最多 131072 位数字,小数点后最多 16383 位数字。
除了普通的数值之外,浮点类型还有几个特殊值:
'Infinity': 无穷大'-Infinity': 负无穷大'NaN': 非数字
其中, PostgreSQL v14 支持 'Infinity' 和 '-Infinity'。
PostgreSQL NUMERIC 实例
基本用法
使用下面的语句创建一个表,名称为 test_numeric:
CREATE TABLE test_numeric (
numeric_5_2 NUMERIC(5,2),
numeric_i NUMERIC
);
使用下面的语句向表中插入一行数据:
INSERT INTO test_numeric (numeric_5_2)
VALUES (1234.456)
RETURNING numeric_5_2;
ERROR: numeric field overflow
DETAIL: A field with precision 5, scale 2 must round to an absolute value less than 10^3.这里,因为数字 1234.234 超出了 NUMERIC(5,2) 的范围,因此 PostgreSQL 给出了一个错误。
下面的语句修改了插入的值,运行它重新尝试插入:
INSERT INTO test_numeric (numeric_5_2)
VALUES (234.456)
RETURNING numeric_5_2;
numeric_5_2
-------------
234.46
(1 row)这里,由于 NUMERIC(5,2) 允许的小数位为 2,因此 234.456 被四舍五入为 234.46。
Infinity 与 NaN
PostgreSQL 14 开始支持 Infinity 与 -Infinity。 您不能向一个有限范围的 NUMERIC 写入 Infinity 与 -Infinity, 否则 PostgreSQL 将给出一个错误。比如:
INSERT INTO test_numeric (numeric_5_2)
VALUES ('Infinity')
RETURNING numeric_5_2;
ERROR: numeric field overflow
DETAIL: A field with precision 5, scale 2 cannot hold an infinite value.下面的语句向类型为 NUMERIC 的列中写入了 Infinity:
INSERT INTO test_numeric (numeric_i)
VALUES ('Infinity')
RETURNING numeric_i;
numeric_i
-----------
Infinity
(1 row)
下面的语句向类型为 NUMERIC 的列中写入了 -Infinity:
INSERT INTO test_numeric (numeric_i)
VALUES ('-Infinity')
RETURNING numeric_i;
numeric_i
-----------
-Infinity
(1 row)
向类型为 NUMERIC 的列中写入了 NaN:
INSERT INTO test_numeric (numeric_5_2)
VALUES ('NaN')
RETURNING numeric_5_2;
numeric_5_2
-------------
NaN
(1 row)
结论
PostgreSQL 提供了 NUMERIC 类型用来存储具有高精度要求的数字类型的数据。由于性能问题,请只在有必要的时候选择 NUMERIC 类型。