目录 3 章

PostgreSQL数据库 第 2 / 3 章

PostgreSQL的数据类型

1371 字 · 约 5 分钟

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、容器类型能原生表达就不强行拆表、伪类型不建列。

← 返回目录