首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL CHAR vs VARCHAR 完整對比:儲存機制、效能差異與選型策略

     編輯:MySQL 綜合教學

MySQL CHAR vs VARCHAR 完整對比:儲存機制、效能差異與選型策略

字串型別選擇看似微不足道,實則直接影響儲存空間、查詢效能、索引大小甚至資料庫備份恢復速度。本文從底層儲存格式、版本演進、實測效能三個維度,為你建立完整決策框架。

核心差異速覽表

特性CHAR(N)VARCHAR(N)
儲存方式固定長度,不足右側填充空格變動長度,實際長度 + 1-2 位元組長度前綴
空間佔用 (存 'ab', N=10)10 位元組4 位元組 (2字元 + 2長度前綴)
尾部空格處理 (5.0+)儲存時保留,讀取時保留儲存時保留,讀取時保留
尾部空格處理 (4.1-)儲存時移除儲存時移除
最大長度 (5.0+)255 字元65,535 位元組 (共享行大小限制)
索引效能固定長度,比較快,無碎片變長,需額外長度檢查,易產生碎片
更新行大小變化不變,原地更新可能導致行遷移、頁面分裂、碎片

底層儲存格式深度解析

CHAR(N) - 固定長度陣列

  • 磁碟上連續佔用 N * 字元集最大位元組數 位元組 (utf8mb4 下 4N 位元組)。
  • 讀取時直接按位移定位,CPU 比較極快 (memcmp)。
  • 適合:長度固定或極小變動、高頻更新、需極致讀取速度的場景。

VARCHAR(N) - 變長結構

  • 實際儲存:1 或 2 位元組長度前綴 + 實際字元資料。
  • 長度 ≤ 255 字元 → 1 位元組前綴;> 255 → 2 位元組前綴。
  • 行溢出機制:當行總大小超過頁面閾值 (~8KB),長字串移至溢出頁,主頁面保留 20 位元組指標。

版本演進關鍵點 (MySQL 5.0 為分水嶺)

  • 5.0 以前:VARCHAR 尾部空格被截斷,CHAR 尾部空格保留但比較時忽略,行為不一致易導致 Bug。
  • 5.0+ (含 5.7、8.0):兩者**均保留尾部空格**,比較時**均包含尾部空格**,符合 SQL 標準,行為一致。
  • 長度單位統一為字元**而非位元組**,支援多位元組字元集 (utf8mb4) 正確計算長度。

效能實測場景與選型建議

場景 1:MD5/SHA 雜湊值、UUID、固定代碼 (ISO 國家碼、貨幣碼)

首選 CHAR(32)/CHAR(36)/CHAR(3)。長度絕對固定,讀取最快,索引最緊湊,無碎片風險。

場景 2:用戶名、郵件、地址、文章標題、JSON 片段

首選 VARCHAR(適當長度)。長度變動大,節省空間顯著。設定合理上限 (如 VARCHAR(191) 適配 utf8mb4 索引前綴限制)。

場景 3:高頻更新的狀態欄位、計數器、標籤

傾向 CHAR(1)/CHAR(2) 或 TINYINT/ENUM。固定長度避免行遷移,減少碎片。極短字串 CHAR 開銷可接受。

場景 4:超長文本 (文章內容、日誌詳情)

使用 TEXT/MEDIUMTEXT/LONGTEXT。超過 64KB 避開 VARCHAR 行大小限制,利用溢出頁機制。

索引策略特殊考量

  • CHAR 索引鍵值固定長度,B+Tree 分頁填充率穩定,範圍掃描極快。
  • VARCHAR 索引鍵值變長,InnoDB 5.7+ 支援前綴壓縮,但長度變動大時易導致頁面分裂。
  • 聯合索引前綴順序:將高選擇性、固定長度欄位 (CHAR) 置前,提升索引過濾效率。

常見誤區澄清

  1. 誤區:「VARCHAR(255) 就好,反正不佔空間。」
    真相:過大的定義長度會增加排序緩衝區、臨時表記憶體佔用,影響 ORDER BY、GROUP BY 效能。
  2. 誤區:「CHAR 比 VARCHAR 快。」
    真相:僅在固定長度、高頻更新、全表掃描比較時有優勢;變長資料用 CHAR 反而浪費空間與 I/O。
  3. 誤區:「VARCHAR 不會產生碎片。」
    真相:頻繁更新導致長度增長時,極易觸發行遷移與頁面分裂,需定期 OPTIMIZE TABLE。

決策檢查清單

  1. 資料長度是否固定?→ 固定用 CHAR,變動用 VARCHAR。
  2. 平均長度 vs 最大長度比例?→ 接近 1 用 CHAR,差距大用 VARCHAR。
  3. 更新頻率高且長度可能變化?→ CHAR 或數值型別替代。
  4. 是否為索引欄位且高選擇性?→ 固定長度優先。
  5. 字元集為 utf8mb4?→ 注意 VARCHAR(191) 索引前綴限制,CHAR 無此限制。

結語

沒有絕對的「更好」,只有「更適合」。理解底層儲存機制,結合業務讀寫模式、字元集、索引策略綜合評估,才能做出最優型別選擇。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved