萬盛學電腦網

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

MySQL VARCHAR 最大長度深度解析:65535 是理論值,實際受行長度、字符集、NULL 限制

三大硬性限制

1. 存儲層限制:65535 字節

VARCHAR 實際數據存儲在聚簇索引外,長度前綴 1-2 字節(≤255 用 1 字節,>255 用 2 字節)。故單列理論上限 65535 字節。

2. 字符集編碼限制

字符集單字符最大字節VARCHAR 最大字符數
latin1165533(不允許 NULL)/ 65532(允許 NULL)
gbk232766 / 32765
utf8321845 / 21844
utf8mb4416383 / 16382

3. 行長度限制:65535 字節(不含 BLOB/TEXT 溢出頁)

一行所有定長列 + 變長列長度前綴 + NULL 位圖 ≤ 65535。

計算實例

-- 單列 VARCHAR(N) CHARSET=gbk,不允許 NULL
N_max = (65535 - 1 - 2) / 2 = 32766
-- -1: 行數據從第 2 字節開始
-- -2: 長度前綴 2 字節
-- /2: gbk 雙字節

-- 多列:INT + CHAR(30) + VARCHAR(N) CHARSET=utf8
N_max = (65535 - 1 - 2 - 4 - 30*3) / 3 = 21812
-- -4: INT 4 字節
-- -90: CHAR(30) utf8 佔 90 字節

超限後果

超過上述任一限制,MySQL **自動轉為 TEXT 類型**並拋 Warning。TEXT 列固定 11 字節指針,不再計入行長度,但失去 VARCHAR 的索引前綴優勢。

CHAR vs VARCHAR vs TEXT 選型

類型長度存儲效能適用場景
CHAR(M)0-255 固定右填充空格,定長索引極快,更新無碎片定長代碼、MD5、UUID、國標代碼
VARCHAR(M)0-65535 變長實際長度+1/2字節前綴空間省、索引稍慢不定長文本、名稱、描述
TEXT0-64KB溢出頁,11字節指針最慢,無法全長索引大文本、文章內容、日誌

InnoDB 特別建議

  • **優先用 VARCHAR 代替 CHAR**
  • InnoDB 行溢出閾值約 8000 字節,大 VARCHAR 會溢出頁,影響性能
  • 頻繁 UPDATE 變長列易產生碎片,定期 OPTIMIZE TABLE

避坑清單

  1. 允許 NULL 會多佔 1 位(NULL 位圖),極限再 -1
  2. utf8mb4 時代,VARCHAR(255) 實際佔 1020 字節,聯合索引最多 6-7 列
  3. 不確定長度時,給業務留餘量(如手機號用 VARCHAR(20) 而非 11)
copyright © 萬盛學電腦網 all rights reserved