首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL CHAR vs VARCHAR 深度比較與選型指南

     編輯:MySQL 資料庫相關知識

核心差異

特性CHARVARCHAR
儲存方式定長,不足補空格變長,實際長度+1-2 字節長度前綴
空間效率固定佔用定義長度僅佔用實際資料長度
讀取速度固定偏移快需解析長度前綴
碎片風險無(定長)頻繁更新長度變化產生碎片

為何仍需 CHAR?

  1. 向下相容:早期資料庫僅支援 CHAR
  2. 內存對齊:部分引擎固定長度利於 CPU 快取行對齊(效能增益極微)
  3. 避免碎片:極高頻更新且長度變化大的場景(但 VARCHAR 節省空間通常更划算)

VARCHAR 長度定義的隱性影響

1. 業務約束

長度即資料驗證,STATUS VARCHAR(5) 僅允許 'NEW'/'DEL'/'CLOSE',防止髒資料入庫。

2. 儲存開銷差異

  • MySQL:<255 用 1 字節長度前綴,≥255 用 2 字節。VARCHAR(10) vs VARCHAR(256) 每行差 1 字節
  • Oracle:動態編碼長度標識,無此問題

3. 索引限制

Oracle:索引鍵長度 ≤ 區塊大小 75%(8K 區塊約 6398 字節),線上重建索引更嚴格(40% ≈ 3215)。超長 VARCHAR 無法建索引或線上重建,影響可用性。

4. 客戶端記憶體

JDBC/ODBC 驅動依定義長度分配緩衝區。VARCHAR(1000) 實際存 10 字元,讀 1 萬行 → 客戶端佔 10MB 有效資料卻分配 1GB 記憶體,高併發易 OOM。

5. 4/8 字節對齊迷思

實測無明顯效能增益,JDBC 驅動已將字串統一存大型 char[],對齊意義不大。

選型建議決策樹

  1. 長度完全可預估(年月、狀態、代碼) → CHAR(n) 或 VARCHAR(實際長度)
  2. 長度可預估上限(姓名、標題) → VARCHAR(合理上限),如 20/30/50
  3. 描述、備註、長文本、無索引需求 → VARCHAR(1024) 或 TEXT
  4. 需建索引 → 嚴格控制長度在引擎上限內,預留線上重建空間
  5. 高併發/大量讀取 → 避免過大定義長度浪費客戶端記憶體

現代最佳實踐

  • 預設選 VARCHAR,除非有明確 CHAR 優勢場景
  • 使用 utf8mb4 字符集,字元長度 ≠ 字節長度(中文 3-4 字節)
  • InnoDB 啟用 innodb_large_prefix 允許 3072 字節索引
  • 定期 OPTIMIZE TABLE 整理碎片
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
引擎單欄上限組合索引上限
InnoDB767 字節(innodb_large_prefix 開啟 3072)3072 字節
MyISAM1000 字節1000 字節
MEMORY3072 字節3072 字節