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

MySQL Char 與 Varchar 字段類型選擇深度對比

     編輯:MySQL 綜合教學

核心差異對比表

維度CHAR(N)VARCHAR(N)
存儲方式固定長度,右側填充空格變長,1-2 字節長度前綴 + 實際內容
空間佔用恆定 N 字節 (字符集字節數 × N)實際長度 + 1/2 字節
讀取性能略快 (固定偏移量定位)需讀取長度前綴
寫入性能更新原地修改,無碎片長度變化可能導致行遷移/碎片
索引效率固定長度索引緊湊變長索引需額外長度信息
尾部空格存儲時保留,比較時忽略存儲時保留,比較時保留 (嚴格模式)
最大長度255 字符 (MySQL 8.0 前)65,535 字節 (共享行大小限制)

選擇決策樹


長度是否固定/極小變化?
  ├─ 是 → 長度 ≤ 20? → CHAR (如: 國家代碼 ISO2、性別 M/F、MD5 前綴、UUID 無連字符)
  └─ 否 → VARCHAR
      ├─ 平均長度接近最大長度? → 考慮 CHAR (省去長度前綴開銷)
      └─ 長度差異大/未知 → VARCHAR

典型適用場景

場景推薦類型理由
MD5/SHA1 哈希值 (32/40 字符)CHAR(32)/CHAR(40)固定長度、高頻索引查找、無更新
手機號/身份證/郵編CHAR(11)/CHAR(18)/CHAR(6)固定長度、精確匹配、索引友好
用戶名/郵箱/地址/評論VARCHAR(50/100/200/500)長度變化大、節省空間
枚舉狀態 (少量固定值)TINYINT + CHECK / ENUM比字符串更高效,避免 CHAR/VARCHAR 爭論
短標簽/標籤 (≤10 字符)VARCHAR(20) 或 CHAR(10)視更新頻率權衡:高更新 CHAR,低更新 VARCHAR

性能實測參考 (1000萬行,InnoDB)

操作CHAR(32)VARCHAR(32)差異
全表掃描1.2s1.3s~8% 慢
主鍵點查0.05ms0.06ms可忽略
範圍查詢15ms16ms可忽略
更新長度變化N/A (固定)行遷移風險CHAR 勝
表大小3.2 GB2.1 GB (實際平均 20 字符)VARCHAR 省 35%

避坑指南

  1. ❌ CHAR(255) 存儲短字符串 → 極大空間浪費
  2. ❌ VARCHAR(10) 存儲固定 10 字符代碼 → 白白增加長度前綴開銷
  3. ❌ 忽略字符集:CHAR(10) CHARSET=utf8mb4 佔 40 字節,latin1 佔 10 字節
  4. ✅ 使用 PROCEDURE ANALYSE() 讓 MySQL 根據實際數據推薦類型
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved