PostgreSQL数据类型怎么选才高效不踩坑?
url: /posts/bf54711525c507c5eacfa7b0151c39d2/
title: PostgreSQL数据类型怎么选才高效不踩坑?
date: 2025-09-27T01:23:27+08:00
lastmod: 2025-09-27T01:23:27+08:00
author: cmdragon
summary:
PostgreSQL 提供丰富的原生数据类型,涵盖数值、字符、日期、几何、网络等多个场景。数值类型包括整数、串行、浮点和精确数值,选择时需权衡范围、精度和存储成本。字符类型有固定长度、可变长度和无长度限制的选项,适用于不同文本存储需求。日期/时间类型支持时区处理,推荐使用timestamptz
确保跨时区一致性。此外,PostgreSQL 还支持布尔、二进制、几何、网络、JSON 和 UUID 等类型,满足多样化数据存储需求。合理选择数据类型能提升存储效率、避免数据错误并优化查询性能。
categories:
- postgresql
tags:
- 基础入门
- PostgreSQL
- 数据类型
- 数值类型
- 字符类型
- 日期时间类型
- JSON类型
- UUID类型

扫描二维码关注或者微信搜一搜:编程智域 前端至全栈交流与成长
发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/
一、PostgreSQL 数据类型概述
PostgreSQL 提供了丰富的原生数据类型,覆盖数值、字符、日期、几何、网络等多个场景。这些类型的设计遵循 SQL 标准,同时扩展了PostgreSQL特有的功能(如几何类型、JSONB)。理解数据类型是设计合理表结构的基础——选择合适的类型能提升存储效率、避免数据错误、优化查询性能。
二、核心数据类型详解
2.1 数值类型:精准存储数字
数值类型是最常用的类型之一,分为整数、串行、浮点、精确数值四大类,选择时需权衡范围、精度、存储成本。
2.1.1 整数类型:固定范围的整数
PostgreSQL 支持3种整数类型,差异在于存储大小和取值范围:
smallint
(int2):2字节,范围-32768 ~ 32767
,适合存储小范围整数(如“性别编码”“评分1-5”)。integer
(int4/int):4字节,范围-2147483648 ~ 2147483647
,最常用(如“用户ID”“商品数量”)。bigint
(int8):8字节,范围-9223372036854775808 ~ 9223372036854775807
,适合超大整数(如“订单量”“雪花ID”)。
示例:创建存储商品库存的表:
-- 库存表:商品ID用integer,库存数量用smallint(假设库存不超过3万)
CREATE TABLE product_stock (product_id integer PRIMARY KEY,stock smallint NOT NULL CHECK (stock >= 0) -- 库存不能为负
);-- 插入数据
INSERT INTO product_stock (product_id, stock) VALUES (1001, 500), (1002, 1200);
2.1.2 串行类型:自动递增的整数
串行类型(smallserial
/serial
/bigserial
)是自动递增的整数,本质是“整数类型 + 序列(Sequence)”的组合,适合作为主键(Primary Key)。
smallserial
(serial2):对应smallint
,自动递增范围1~32767。serial
(serial4):对应integer
,范围1~2147483647(最常用)。bigserial
(serial8):对应bigint
,范围1~9223372036854775807。
示例:用serial
作为用户表主键:
-- 用户表:user_id自动递增
CREATE TABLE users (user_id serial PRIMARY KEY, -- 等价于:user_id integer PRIMARY KEY DEFAULT nextval('users_user_id_seq')username varchar(50) NOT NULL UNIQUE
);-- 插入数据时无需指定user_id,自动生成
INSERT INTO users (username) VALUES ('alice'), ('bob');-- 查询结果:user_id会是1、2
SELECT * FROM users;
2.1.3 浮点类型:近似数值
浮点类型(real
/double precision
)用于存储近似小数,适合不需要精确计算的场景(如科学计算、统计预估)。
real
(float4):4字节,精度约6位有效数字。double precision
(float8/float):8字节,精度约15位有效数字。
注意:浮点类型有精度损失,比如0.1
无法精确存储,因此财务计算(如金额)绝对不能用浮点类型!
示例:存储商品重量(允许近似):
CREATE TABLE products (product_id integer PRIMARY KEY,weight real -- 重量,单位kg(如1.23kg)
);INSERT INTO products VALUES (1001, 1.23), (1002, 4.5678);
2.1.4 精确数值类型:无精度损失
numeric
(或decimal
)用于存储精确小数,适合财务、金融等需要高精度的场景(如金额、税率)。格式为numeric(p, s)
:
p
:总有效位数(精度),范围1~1000。s
:小数位数(刻度),范围0~p(默认0)。
示例:存储订单金额(精确到分):
CREATE TABLE orders (order_id serial PRIMARY KEY,amount numeric(10, 2) NOT NULL -- 总金额,最多10位数字,2位小数(如99999999.99)
);INSERT INTO orders (amount) VALUES (123.45)</