PostgreSQL 提供了多种字符串类型,它们在存储方式、长度限制和适用场景上有所不同。以下是主要字符串类型的详细对比和区别:
一、核心字符串类型对比
-
CHAR(n)/CHARACTER(n)
- 特点:固定长度字符串,不足部分用空格填充
- 最大长度:1GB(PostgreSQL特有,远超SQL标准的255字符)
- 存储方式:实际存储空间 = 4字节 + 声明长度n
- 示例:
CHAR(5)
存储’ab’会变为’ab '(补3空格)
-
VARCHAR(n)/CHARACTER VARYING(n)
- 特点:可变长度字符串,按实际长度存储
- 最大长度:1GB(不指定n时)
- 存储方式:4字节 + 实际字符串长度
- 与CHAR区别:不填充空格,尾部空格保留语义
-
TEXT
- 特点:无长度限制的可变字符串
- 优势:适合存储大段文本(如文章、日志)
- 与VARCHAR比较:功能几乎相同,但TEXT无需声明长度
二、关键区别总结
类型 | 长度限制 | 存储方式 | 空格处理 | 适用场景 |
---|---|---|---|---|
CHAR(n) | 固定n | 填充空格至声明长度 | 比较时忽略填充空格 | 固定长度编码(如ISBN) |
VARCHAR(n) | 最大n | 按实际长度存储 | 保留尾部空格语义 | 可变长度字符串 |
TEXT | 无限制 | 动态分配存储空间 | 保留所有空格 | 大文本内容存储 |
三、特殊字符串类型
-
BPCHAR(n)
- PostgreSQL特有类型,功能同CHAR(n),用于兼容性
-
CITEXT
- 不区分大小写的文本类型,适合实现大小写不敏感的唯一约束
-
NAME
- 专用于存储数据库对象名称(如表名、列名),最大63字符
四、性能与选择建议
-
性能差异
- 在PostgreSQL中,三种主要类型性能几乎无差别(与MySQL不同)
- CHAR(n)因填充空格可能略微增加存储开销
-
选择指南
- 确定长度且需对齐:用CHAR(n)(如国家代码CHAR(2))
- 长度可变但有上限:用VARCHAR(n)(如用户名VARCHAR(50))
- 大文本或长度不确定:优先用TEXT
-
注意事项
- CHAR不指定长度时默认为CHAR(1)
- VARCHAR不指定长度时可存储任意长度(最大1GB)
- 超长字符串可能被存储到TOAST表(透明压缩技术)
五、与其他数据库对比
特性 | PostgreSQL | MySQL |
---|---|---|
CHAR最大长度 | 1GB | 255字符 |
VARCHAR最大长度 | 1GB | 64KB |
TEXT类型细分 | 单一TEXT类型 | 分TINYTEXT/LONGTEXT等 |
官方推荐:在PostgreSQL中多数场景使用TEXT或VARCHAR即可,无需刻意使用CHAR