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

MySQL VARCHAR 長度限制深度解析與實戰計算

     編輯:MySQL 資料庫相關知識

版本差異核心結論

三大硬性限制規則

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

  • VARCHAR 實際數據存儲在聚簇索引外部溢出頁
  • 長度前綴:1 字節(≤255)或 2 字節(>255)
  • 理論最大長度:65,535 - 1~2 字節長度前綴

2. 字符集編碼限制

MySQL 版本VARCHAR(N) 含義UTF8 中文存儲上限
4.0 及之前N 字節N/3 個字符(如 20/3=6 個)
5.0+N 字符N 個字符(與字節無關)
字符集單字符最大字節VARCHAR 最大字符數
latin1165,532
gbk232,766
utf8321,844
utf8mb4416,382

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

3. 行長度限制:65,535 字節(不含 BLOB/TEXT 溢出數據)

單行所有定長字段 + 變長字段長度前綴 + NULL 位圖 + 指針 ≤ 65,535 字節。

實戰計算公式與案例

案例 A:單表單字段 VARCHAR(N) CHARSET=gbk

最大 N = (65535 - 1 - 2) / 2 = 32,766
-- 解釋:-1 行起始偏移,-2 長度前綴(>255),/2 gbk雙字節

案例 B:混合字段表

CREATE TABLE t (
  c1 INT,           -- 4 字節
  c2 CHAR(30),      -- 30 * 3 = 90 字節 (utf8)
  c3 VARCHAR(N)     -- 目標字段 utf8
) CHARSET=utf8;

最大 N = (65535 - 1 - 2 - 4 - 90) / 3 = 21,812
-- 扣除:行偏移1、長度前綴2、INT 4、CHAR(30) 90,除以 utf8 單字符3字節

案例 C:超限自動轉 TEXT 的影響

  • 定義長度變為固定 11 字節(指針 + 長度)
  • 實際數據移至溢出頁,讀取需額外 IO
  • 不可逆:需 ALTER TABLE ... MODIFY col VARCHAR(new_len) 手動改回

設計最佳實踐

  1. 預留餘量:業務最大長度 × 1.5 ~ 2 作為 N,避免頻繁 DDL
  2. 慎用 CHAR:固定長度佔用行空間,僅用於極短固定長字段(如 MD5、UUID、ISO 代碼)
  3. 大字段拆表:超過 4000 字符建議獨立表,主表只存 ID + 摘要
  4. utf8mb4 時代:按 4 字節/字符預算,單表 VARCHAR 總和不超 16,000 字符
  5. 監控指標:SHOW TABLE STATUS 中 Avg_row_length 接近 60KB 即需預警

快速驗證腳本

-- 查看表行格式與平均長度
SHOW TABLE STATUS LIKE 't'\G

-- 查看字段定義長度
SELECT COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH, CHARACTER_OCTET_LENGTH 
FROM information_schema.COLUMNS 
WHERE TABLE_SCHEMA='db' AND TABLE_NAME='t';

理解三大限制與字符集字節差異,結合業務實際預估長度,可避免 90% VARCHAR 設計陷阱與隱性性能問題。

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