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

MySQL 字符數據類型深度解析:CHAR、VARCHAR、TEXT、BLOB 選型指南

     編輯:MySQL 綜合教學

MySQL 字符數據類型深度解析:CHAR、VARCHAR、TEXT、BLOB 選型指南

正確選擇字符類型對存儲效率、索引效能、應用邏輯正確性至關重要。本文系統梳理 MySQL 5.0+ 版本中 CHAR、VARCHAR、TEXT、BLOB 的存儲機制、長度限制、編碼影響、性能差異及選型建議。

1. VARCHAR 類型演進與長度限制

  • 版本差異:MySQL 4.1 及之前 VARCHAR(255) 最大 255 字節;5.0+ 最大長度擴展至 65,535 字節 (實際可存 65,532 字節,2 字節存長度,若超 255 則用 3 字節)。
  • 字符 vs 字節:
    • 4.1-:VARCHAR(20) 指 20 字節,UTF-8 漢字佔 3 字節,僅能存 6 個。
    • 5.0+:VARCHAR(20) 指 20 字符,無論數字、字母、UTF-8 漢字均可存 20 個。
  • 三大硬性限制 (任一觸發即報錯或轉型):
    1. 存儲限制:行外存儲,長度前綴 1-2 字節,最大 65,535 字節。
    2. 編碼長度限制:
      • GBK (雙字節) → 最大 32,766 字符
      • UTF8 (三字節) → 最大 21,845 字符
      • UTF8MB4 (四字節) → 最大 16,383 字符
      超限會強制轉為 TEXT 並產生 Warning。
    3. 行長度限制:單行定義總長度 (不含 BLOB/TEXT 外溢部分) 不得超過 65,535 字節。超限報錯 ERROR 1118 (42000): Row size too large,需將大字段改為 TEXT/BLOB。

2. CHAR(M) vs VARCHAR(M) 核心差異

特性CHAR(M)VARCHAR(M)
長度類型固定長度 (0-255)可變長度 (0-65,535)
存儲方式右側空格填充至 M 字節實際長度 + 1/2 字節長度前綴
檢索行為尾部空格自動移除尾部空格保留 (標準 SQL)
索引效率高 (固定長度利於 B+ 樹定位)略低
適用場景長度固定/近似固定 (MD5、手機號、ISO 代碼、枚舉值)長度變動大、平均長度遠小於最大長度

空間換時間:定長 CHAR 適合極高頻讀寫、長度穩定的列;VARCHAR 節省空間,適合通用業務字段。

3. VARCHAR vs TEXT/BLOB

  • 定義差異:VARCHAR 必須指定長度 (M),TEXT 無需指定。
  • 最大容量:VARCHAR 受行長 64KB 限制;TEXT 族最高 LONGTEXT 可達 4GB。
  • 存儲結構:VARCHAR 列數據直接存行中 (溢出則行外);TEXT/BLOB 永遠行外存儲,行內僅存 1-4 字節指針。
  • 默認值:CHAR/VARCHAR 可設 DEFAULT;TEXT/BLOB 不能 設默認值。
  • 大小寫敏感:BLOB 二進制比較 (大小寫敏感);TEXT 字符比較 (大小寫不敏感,取決於 Collation)。

4. 選型決策樹 (InnoDB 為例)

  1. 長度固定且 ≤ 255 字節 → CHAR (如 UUID、MD5、國家代碼)。
  2. 長度可變,最大 ≤ 21,845 (UTF8) / 16,383 (UTF8MB4) 且行總長允許 → VARCHAR (通用首選)。
  3. 超過 VARCHAR 編碼/行長限制,或需存儲大文本/二進制 → TEXT / BLOB (按大小選 TINY/MEDIUM/LONG)。
  4. 頻繁 WHERE 過濾、JOIN、ORDER BY 的字符列 → 優先 VARCHAR + 索引;避免 TEXT 參與索引 (需指定前綴長度且效率低)。
  5. 整型列若無負值 → 加 UNSIGNED 翻倍正向範圍;常用於主鍵、外鍵、狀態碼。

5. 總結建議

  • 效能排序:CHAR > VARCHAR > TEXT (InnoDB 下差距縮小,但邏輯仍成立)。
  • 編碼統一:新項目強制 utf8mb4 + utf8mb4_general_ci (或 0900_ai_ci),預留 Emoji/生僻字空間。
  • 避免選型陷阱:盲目用 VARCHAR(255) 當萬金油;TEXT 存短字符串卻無法設默認值;CHAR 存長文本導致巨大空間浪費。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved