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