字串型別選擇看似微不足道,實則直接影響儲存空間、查詢效能、索引大小甚至資料庫備份恢復速度。本文從底層儲存格式、版本演進、實測效能三個維度,為你建立完整決策框架。
| 特性 | CHAR(N) | VARCHAR(N) |
|---|---|---|
| 儲存方式 | 固定長度,不足右側填充空格 | 變動長度,實際長度 + 1-2 位元組長度前綴 |
| 空間佔用 (存 'ab', N=10) | 10 位元組 | 4 位元組 (2字元 + 2長度前綴) |
| 尾部空格處理 (5.0+) | 儲存時保留,讀取時保留 | 儲存時保留,讀取時保留 |
| 尾部空格處理 (4.1-) | 儲存時移除 | 儲存時移除 |
| 最大長度 (5.0+) | 255 字元 | 65,535 位元組 (共享行大小限制) |
| 索引效能 | 固定長度,比較快,無碎片 | 變長,需額外長度檢查,易產生碎片 |
| 更新行大小變化 | 不變,原地更新 | 可能導致行遷移、頁面分裂、碎片 |
N * 字元集最大位元組數 位元組 (utf8mb4 下 4N 位元組)。1 或 2 位元組長度前綴 + 實際字元資料。VARCHAR 尾部空格被截斷,CHAR 尾部空格保留但比較時忽略,行為不一致易導致 Bug。首選 CHAR(32)/CHAR(36)/CHAR(3)。長度絕對固定,讀取最快,索引最緊湊,無碎片風險。
首選 VARCHAR(適當長度)。長度變動大,節省空間顯著。設定合理上限 (如 VARCHAR(191) 適配 utf8mb4 索引前綴限制)。
傾向 CHAR(1)/CHAR(2) 或 TINYINT/ENUM。固定長度避免行遷移,減少碎片。極短字串 CHAR 開銷可接受。
使用 TEXT/MEDIUMTEXT/LONGTEXT。超過 64KB 避開 VARCHAR 行大小限制,利用溢出頁機制。
CHAR 索引鍵值固定長度,B+Tree 分頁填充率穩定,範圍掃描極快。VARCHAR 索引鍵值變長,InnoDB 5.7+ 支援前綴壓縮,但長度變動大時易導致頁面分裂。ORDER BY、GROUP BY 效能。OPTIMIZE TABLE。沒有絕對的「更好」,只有「更適合」。理解底層儲存機制,結合業務讀寫模式、字元集、索引策略綜合評估,才能做出最優型別選擇。