八月 23, 2023
摘要:在本教程中,您将了解 PostgreSQL 中用于存储数值数据的NUMERIC
类型。
目录
PostgreSQL NUMERIC 数据类型简介
NUMERIC
类型可以存储具有很多位数的数字。通常,您会将NUMERIC
类型用于需要精确性的数字,例如货币金额或数量。
下面说明了NUMERIC
类型的语法:
NUMERIC(precision, scale)
在此语法中,precision
是总位数,scale
是小数部分的位数。例如,数字1234.567
的精度是7
,小数位数是3
。
NUMERIC
类型最多可以保存小数点前131,072
位和小数点后16,383
位的值。
NUMERIC
类型的小数位数可以为零或正数。下面显示了小数位数为零的NUMERIC
类型的语法:
NUMERIC(precision)
如果同时省略precision
和scale
,则可以存储任何精度和小数位数,最高可达上述精度和小数位数的限制。
NUMERIC
在 PostgreSQL 中,NUMERIC
和DECIMAL
类型是等效的,并且它们都是 SQL 标准的一部分。
如果不需要精度,则不应使用NUMERIC
类型,因为NUMERIC
值的计算通常比整数、浮点数和双精度慢。
PostgreSQL NUMERIC 示例
让我们看一些使用 PostgreSQL 的NUMERIC
类型的示例。
1) 存储 numeric 数值
如果您存储的值的小数位数大于NUMERIC
列声明的小数位数,PostgreSQL 会将该值四舍五入 (round) 到指定的小数位数。
请参阅以下示例。
首先,创建一个新表,名为products
,用于演示:
DROP TABLE IF EXISTS products;
CREATE TABLE products (
id SERIAL PRIMARY KEY,
name VARCHAR(100) NOT NULL,
price NUMERIC(5,2)
);
其次,插入一些价格范围超出该price
列声明范围的产品:
INSERT INTO products (name, price)
VALUES ('Phone',500.215),
('Tablet',500.214);
由于price
列的小数位数为 2,PostgreSQL 将值500.215
向上舍入为500.22
,并将值500.214
向下舍入为500.21
:
以下查询返回products
表的所有行:
SELECT * FROM products;
如果您存储的值的精度超过声明的精度,PostgreSQL 将引发错误,如下例所示:
INSERT INTO products (name, price)
VALUES('Phone',123456.21);
PostgreSQL 发出以下错误:
ERROR: numeric field overflow
DETAIL: A field with precision 5, scale 2 must round to an absolute value less than 10^3.
PostgreSQL NUMERIC 类型和 NaN
除了保存数字值之外,NUMERIC
类型还可以保存一个称为NaN
的特殊值,表示“非数字”。
以下示例将 ID 为 1 的产品价格更新为NaN
:
UPDATE products
SET price = 'NaN'
WHERE id = 1;
请注意,您必须使用单引号将NaN
括起来,如上面的 UPDATE 语句所示。
以下查询返回products
表的数据:
SELECT * FROM products;
通常,NaN
不等于任何数字(包括其自身)。这意味着表达式NaN = NaN
返回false
。
但是,两个NaN
值相等并且NaN
大于其他数字。此实现允许 PostgreSQL 对NUMERIC
值进行排序并在基于树的索引中使用它们。
以下查询根据价格对产品进行排序:
SELECT * FROM products
ORDER BY price DESC;
从输出中可以看出,NaN
大于500.21
。
在本教程中,您了解了 PostgreSQL 的NUMERIC
数据类型,以及如何使用NUMERIC
列来存储数字。
了解更多
PostgreSQL 教程:数据类型
PostgreSQL 文档:任意精度数字