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

MySQL VARCHAR 長度設置全解析:從字符集到存儲引擎深度剖析

     編輯:MySQL 資料庫相關知識

核心結論先行

MySQL 5.0+ 版本中,VARCHAR(M) 的 M 代表字符數,與字符集無關。 VARCHAR(50) 無論存中文、英文、數字,均可容納 50 個字符。這是與 MySQL 4.1 及以前版本(按字節計算)的本質區別。

版本演進關鍵節點

版本VARCHAR 最大長度長度單位備註
≤ 4.1255字節超長需用 TEXT/BLOB
5.0~5.0.265,535字節行長度限制 65,535 字節
≥ 5.0.365,535字符引入字符集感知,實際上限受字符集影響

三大硬性限制詳解

1. 存儲層限制(65,535 字節)

VARCHAR 數據存放在聚簇索引外,前綴 1~2 字節記錄長度。單行所有非 BLOB/TEXT 列的存儲總和不能超過 65,535 字節。

2. 編碼層限制

-- 字符集最大字符數 = 65,535 / 單字符最大字節數
utf8   : 65,535 / 3 = 21,845
utf8mb4: 65,535 / 4 = 16,383
gbk    : 65,535 / 2 = 32,767
latin1 : 65,535 / 1 = 65,535

超過此限制會自動轉為 TEXT 類型並產生 Warning。

3. 行長度限制

ERROR 1118 (42000): Row size too large... 當單行定義超過 65,535 字節拋出。解決方案:將大字段改為 TEXT/BLOB 或調整字符集。

CHAR vs VARCHAR 深度對比

維度CHAR(M)VARCHAR(M)
長度特性固定長度,右側填充空格可變長度,無填充
存儲開銷M 字節實際長度 + 1~2 字節
索引效率高(定長便於計算)略低
適用場景長度固定、高頻更新(如 MD5、手機號)長度不定、節省空間優先
InnoDB 建議慎用推薦使用

VARCHAR vs TEXT/BLOB 選型決策樹

  1. 長度 ≤ 65,535 字符 且 需要默認值/索引完整 → VARCHAR
  2. 長度 > 65,535 字符 → TEXT/BLOB
  3. 頻繁全文檢索 → TEXT + 全文索引
  4. 存儲二進制(圖片/文件) → BLOB

性能優化建議

  • InnoDB 下優先 VARCHAR:避免 CHAR 固定長度造成空間浪費與頁分裂
  • INT 類型加 UNSIGNED:業務無負值時擴大正數範圍
  • WHERE 條件列加索引:特別是整型列,索引選擇性最高
  • 避免隱式類型轉換:WHERE varchar_col = 123 導致全表掃描

掌握這些細節,能讓你在架構設計、慢查詢優化、容量規劃中遊刃有餘。

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