PostgreSQL 字符类型教程
PostgreSQL 的字符类型有 CHAR(n)、VARCHAR(n)、TEXT 三种,以及定长/变长的存储差异。实践中 TEXT 几乎总是正确选择。
本篇内容
- CHAR(n) / VARCHAR(n) / TEXT 的语义
- 长度限制与超长报错
- 字符集与排序规则(collation)
- 性能差异与选型建议
三种字符类型
CREATE TABLE users (
-- CHAR(n):定长,不足补空格,查询时会去掉尾部空格
code CHAR(6),
-- VARCHAR(n):变长,带长度限制
name VARCHAR(50) NOT NULL,
-- TEXT:变长,无长度限制(PostgreSQL 中与 VARCHAR 性能几乎相同)
bio TEXT
);
长度与截断
-- 超长直接报错,不会静默截断
INSERT INTO users (name) VALUES (repeat('A', 100)); -- ERROR: value too long
-- 查看字符长度(字符数,不是字节数)
SELECT char_length(name), octet_length(name) FROM users;
-- 显式截断
SELECT left(name, 10) FROM users;
待补充(TODO)
- 补充:字符集(UTF-8)与多字节字符的长度语义
- 补充:排序规则 collation 对大小写、中文排序和唯一索引的影响
- 补充:TEXT 与 VARCHAR(n) 在存储和索引上的真实差异
- 补充:模式匹配(LIKE / 正则)与前缀索引(text_pattern_ops)