跳到主要内容

PostgreSQL 数值类型教程

PostgreSQL 的数值类型分三类:整数(SMALLINT / INTEGER / BIGINT)、精确小数(NUMERIC / DECIMAL)、浮点(REAL / DOUBLE PRECISION)。选型的核心是精度与范围。

本篇内容​

  • 整数类型与范围
  • NUMERIC:精确小数(金额首选)
  • REAL / DOUBLE PRECISION:浮点与舍入误差
  • 类型选择建议

整数类型​

CREATE TABLE t (
a SMALLINT, -- 2 字节,-32768 ~ +32767
b INTEGER, -- 4 字节,±21 亿
c BIGINT -- 8 字节,±922 亿亿
);

NUMERIC(精确小数)​

-- NUMERIC(精度, 标度):共 10 位、小数 2 位
CREATE TABLE orders (
amount NUMERIC(10, 2) NOT NULL
);

-- 精确计算,没有二进制浮点误差
SELECT 0.1::NUMERIC + 0.2::NUMERIC; -- 0.3

浮点类型​

-- DOUBLE PRECISION:8 字节,约 15~16 位有效数字,有舍入误差
SELECT 0.1::DOUBLE PRECISION + 0.2::DOUBLE PRECISION; -- 0.30000000000000004
待补充(TODO)
  • 补充:整数溢出行为与运算时的类型提升规则
  • 补充:NUMERIC 未指定精度时的任意精度行为与性能代价
  • 补充:浮点与 NaN、Infinity 的特殊值
  • 补充:金额/计数/坐标等场景的选型建议表