PostgreSQL 教程: numeric 数值类型

八月 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)

如果同时省略precisionscale,则可以存储任何精度和小数位数,最高可达上述精度和小数位数的限制。

NUMERIC

在 PostgreSQL 中,NUMERICDECIMAL类型是等效的,并且它们都是 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 NUMERIC example

如果您存储的值的精度超过声明的精度,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;

PostgreSQL NUMERIC NaN example

通常,NaN不等于任何数字(包括其自身)。这意味着表达式NaN = NaN返回false

但是,两个NaN值相等并且NaN大于其他数字。此实现允许 PostgreSQL 对NUMERIC值进行排序并在基于树的索引中使用它们。

以下查询根据价格对产品进行排序

SELECT * FROM products
ORDER BY price DESC;

PostgreSQL NUMERIC NaN Sorting Example

从输出中可以看出,NaN大于500.21

在本教程中,您了解了 PostgreSQL 的NUMERIC数据类型,以及如何使用NUMERIC列来存储数字。