PostgreSQL 数据类型组织架构
PostgreSQL 数据类型
├── 1. 数值与货币类型族
│ ├── 整数部
│ │ ├── smallint / int2 2字节整数
│ │ ├── integer / int / int4 4字节整数,最常用
│ │ └── bigint / int8 8字节整数
│ ├── 自增语法糖部
│ │ ├── smallserial / serial2
│ │ ├── serial / serial4
│ │ └── bigserial / serial8
│ ├── 精确数值部
│ │ └── numeric / decimal 任意精度,金额/精确小数首选
│ ├── 浮点数值部
│ │ ├── real / float4 4字节,不精确
│ │ └── double precision / float8 8字节,不精确
│ └── 货币部
│ └── money 货币金额,受 lc_monetary 影响,跨区域慎用
│
├── 2. 布尔类型族
│ └── boolean / bool true / false / null
│
├── 3. 字符类型族
│ ├── 变长部
│ │ ├── varchar(n) / character varying(n) 有长度限制变长字符串
│ │ └── text 无长度限制变长字符串,常用
│ ├── 定长部
│ │ └── char(n) / character(n) 定长,空格填充,现代少用
│ └── 内部标识部
│ └── name 内部标识符类型,系统目录常用
│
├── 4. 二进制与位串类型族
│ ├── 二进制部
│ │ └── bytea 原始字节数组,如图片、哈希、文件内容
│ └── 位串部
│ ├── bit(n) 定长位串
│ └── bit varying(n) / varbit(n) 变长位串
│
├── 5. 日期与时间类型族
│ ├── 日期部
│ │ └── date 日期,年月日
│ ├── 时间部
│ │ ├── time / time without time zone 仅时间
│ │ └── time with time zone / timetz 带时区时间,通常慎用
│ ├── 时间戳部
│ │ ├── timestamp / timestamp without time zone 日期时间,不带时区
│ │ └── timestamptz / timestamp with time zone 日期时间,带时区,记录时间点首选
│ └── 间隔部
│ └── interval 时间间隔,如 1 day 2 hours
│
├── 6. JSON 与 XML 类型族
│ ├── JSON部
│ │ ├── json 保留原始文本,查询需解析,不支持索引
│ │ └── jsonb 二进制分解存储,查询快,支持 GIN 索引,默认首选
│ └── XML部
│ └── xml 存储 XML 数据
│
├── 7. 网络地址类型族
│ ├── inet IPv4/IPv6 主机地址
│ ├── cidr IPv4/IPv6 网络地址
│ ├── macaddr MAC 地址
│ └── macaddr8 8字节 MAC 地址
│
├── 8. 几何类型族
│ ├── point 点
│ ├── line 无限直线
│ ├── lseg 线段
│ ├── box 矩形框
│ ├── path 路径
│ ├── polygon 多边形
│ └── circle 圆
│
├── 9. 文本检索类型族
│ ├── tsvector 文档向量,用于全文检索
│ └── tsquery 查询表达式,用于全文检索
│
├── 10. UUID 与对象标识类型族
│ ├── UUID部
│ │ └── uuid 通用唯一标识符,分布式主键常用
│ └── 对象标识部
│ ├── oid 对象标识符
│ ├── regclass 表/索引等关系 OID 别名
│ ├── regtype 数据类型 OID 别名
│ ├── regproc / regprocedure 函数 OID 别名
│ ├── regoper / regoperator 操作符 OID 别名
│ ├── regrole 角色 OID 别名
│ ├── regnamespace 命名空间 OID 别名
│ └── regconfig / regdictionary 文本检索配置/字典 OID 别名
│
├── 11. 日志序列号类型族
│ └── pg_lsn PostgreSQL 日志序列号 LSN
│
├── 12. 用户定义与容器类型族
│ ├── 枚举部
│ │ └── enum 静态有序枚举值,如订单状态
│ ├── 数组部
│ │ └── 任意类型[] 多维变长数组,如 integer[]、text[][]
│ ├── 复合部
│ │ └── composite type CREATE TYPE ... AS (...),行类型/复合结构
│ ├── 范围部
│ │ ├── int4range 整数范围
│ │ ├── int8range 大整数范围
│ │ ├── numrange numeric 范围
│ │ ├── tsrange 时间戳范围
│ │ ├── tstzrange 带时区时间戳范围
│ │ ├── daterange 日期范围
│ │ └── 自定义范围 CREATE TYPE ... AS RANGE
│ └── 域部
│ └── domain CREATE DOMAIN,在基础类型上加约束/默认值
│
├── 13. 伪类型族(函数/过程专用,不能作为普通表列)
│ ├── any
│ ├── anyelement
│ ├── anyarray
│ ├── anynonarray
│ ├── anyenum
│ ├── anyrange
│ ├── cstring
│ ├── internal
│ ├── record
│ ├── trigger
│ ├── void
│ ├── language_handler
│ ├── fdw_handler
│ ├── index_am_handler
│ └── tsm_handler
│
└── 14. 扩展类型族(需安装扩展)
├── PostGIS:geometry、geography 等
├── hstore:键值对
├── citext:大小写不敏感文本
├── ltree:标签树/层级路径
├── pgvector:vector 向量类型
└── 其他扩展自定义类型
各部门职责与选型要点#
| 一级部门 | 核心职责 | 关键选型原则 |
|---|---|---|
| 数值与货币 | 存整数、小数、金额、浮点 | 金额/精确小数用 numeric;普通计数用 integer/bigint;浮点仅用于科学计算等可接受误差场景;serial 是自增语法糖,不是独立存储类型 |
| 布尔 | 真假值 | 用 boolean,不要用字符模拟 |
| 字符 | 文本 | 绝大多数用 text 或 varchar(n);char(n) 会空格填充,少用 |
| 二进制与位串 | 原始字节、位掩码 | 文件/哈希用 bytea;位标志用 bit/varbit |
| 日期时间 | 日期、时间、时间点、间隔 | 记录时间点优先 timestamptz;仅日期用 date;时长用 interval;timetz 通常慎用 |
| JSON/XML | 半结构化数据 | 默认 jsonb;需保留原始文本格式才用 json |
| 网络地址 | IP/MAC | 用 inet/cidr/macaddr,自带格式校验和子网运算 |
| 几何 | 简单空间数据 | 简单几何用内置类型;复杂 GIS 用 PostGIS |
| 文本检索 | 全文搜索 | tsvector + tsquery + GIN |
| UUID/对象标识 | 唯一标识、系统对象引用 | 分布式主键用 uuid;系统目录/函数参数可用 reg* |
| 用户定义与容器 | 枚举、数组、复合、范围、域 | 数据天然是列表用数组;固定状态用枚举;区间用范围;需约束复用用域 |
| 伪类型 | 函数/过程签名 | 不能建普通表列,只用于函数参数/返回值等 |
| 扩展类型 | 领域专用能力 | 按业务安装扩展,如 GIS、向量检索、层级树 |
一句话总览#
PostgreSQL 数据类型可组织为:基础标量部门(数值、字符、布尔、二进制、日期时间、网络、几何、JSON/XML、UUID、文本检索等)+容器与用户定义部门(数组、复合、范围、枚举、域)+系统与函数专用部门(对象标识、pg_lsn、伪类型)+扩展部门(PostGIS、hstore、pgvector 等)。选型核心是:精确性优先、时间点用 timestamptz、JSON 默认 jsonb、容器类型能原生表达就不强行拆表、伪类型不建列。