萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL CHAR、VARCHAR、TEXT 類型深度對比與選型指南

三大類型核心差異

特性CHARVARCHARTEXT
長度特性固定長度 (0-255)可變長度 (0-65,535)4 種:TINY/TEXT/MEDIUM/LONG (255B-4GB)
存儲方式右側填充空格至定長1-2 字節長度前綴 + 實際數據對象指針,溢出頁存儲
尾部空格讀取時自動去除保留(5.0.3+)保留
大小寫轉換不轉換不轉換不轉換
默認值支持支持不支持
索引前綴可選可選必須指定
排序比較按字節/校對規則按字節/校對規則按校對規則
內存處理內聯存儲內聯存儲單獨對象,可能產生臨時表

存儲開銷詳解

  • CHAR(M):固定 M 字節,按字符集編碼(utf8mb4 佔 4M 字節)
  • VARCHAR(M):L + 1/2 字節(L ≤ 255 用 1 字節,否則 2 字節),實際長度 L
  • TEXT/BLOB:768 字節前綴存頁內,超出存溢出頁,指針 20 字節

性能影響

  • CHAR:固定長利於索引、排序、臨時表,但浪費空間;適合定長代碼(MD5、UUID、郵編、手機號)
  • VARCHAR:空間效率高,但 UPDATE 可能導致行遷移、碎片;適合不定長文本(標題、描述、JSON 片段)
  • TEXT:大文本存儲,不支持全字段索引,排序截取 max_sort_length(默認 1024 字節),查詢易產生磁盤臨時表

選型決策樹

  1. 長度固定且 ≤ 255 字符?→ CHAR
  2. 長度可變且 ≤ 65,535 字符?→ VARCHAR
  3. 超長文本(文章、日誌、JSON 文檔)?→ TEXT(配合前綴索引)
  4. 二進制數據(圖片、文件)?→ BLOB 系列

常見誤區

  1. 誤以為 VARCHAR(255) 最優:255 是單字節長度前綴邊界,實際應按業務長度定義
  2. TEXT 當 VARCHAR 用:無法建全字段索引、默認值、內存開銷大
  3. 忽略字符集影響:utf8mb4 下 CHAR(100) 佔 400 字節,VARCHAR 同理
  4. 排序大文本不截取:ORDER BY text_col 只比對前 1024 字節,需 ORDER BY SUBSTRING(text_col,1,2000)

InnoDB 行格式影響

  • COMPACT/REDUNDANT:前 768 字節內聯
  • DYNAMIC/COMPRESSED:全溢出頁,僅存 20 字節指針,適合大 TEXT/BLOB

最佳實踐

  • 業務主鍵、代碼、枚舉值 → CHAR
  • 姓名、標題、標籤、短描述 → VARCHAR(合理長度)
  • 正文、評論、日誌、JSON → TEXT + 前綴索引 INDEX idx_content (content(100))
  • 避免 SELECT * 查詢含 TEXT 表,顯式列出所需列
copyright © 萬盛學電腦網 all rights reserved