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

MySQL VARCHAR 長度設置深度解析:字符數 vs 字節數、utf8mb4 實際上限、行長度限制與選型建議

     編輯:MySQL 綜合教學

MySQL VARCHAR 長度設置深度解析:字符數 vs 字節數、utf8mb4 實際上限、行長度限制與選型建議

VARCHAR(M) 中的 M 代表字符數而非字節數,但實際存儲受字符集編碼和行長度 65535 字節雙重限制。本文系統梳理 VARCHAR 長度計算規則、不同字符集實際上限、超限自動轉 TEXT 機制、CHAR/VARCHAR/TEXT 選型決策樹。

一、核心結論速覽

定義字符集最大字符數說明
VARCHAR(65535)latin1 (1字節/字符)65532行長度上限 65535 - 1-2字節長度前綴 - NULL標誌
VARCHAR(65535)utf8 (3字節/字符)2184465532 / 3 向下取整
VARCHAR(65535)utf8mb4 (4字節/字符)1638365532 / 4 向下取整
VARCHAR(21845)utf8報錯超過 65532 字節行長度限制,自動轉 MEDIUMTEXT

二、存儲開銷精確計算

實際存儲字節數 = 字符實際字節長度 + 長度前綴字節數
長度前綴 = 1 字節 (M ≤ 255) 或 2 字節 (M > 255)

-- 示例:utf8mb4 表,VARCHAR(100) 存 'abc' (3字符)
-- 字符字節 = 3 × 4 = 12 字節
-- 前綴 = 1 字節 (100 ≤ 255)
-- 總計 = 13 字節

三、版本演進與關鍵差異

版本VARCHAR 最大長度M 含義中文存儲
MySQL 4.1 以前255字節數VARCHAR(20) 存 6 個 UTF8 漢字 (20/3)
MySQL 5.0.3+65,535字符數VARCHAR(20) 存 20 個 UTF8 漢字

重大變更:5.0.3+ 將 M 從字節改為字符,並引入長度前綴機制,極大提升了多語言存儲能力。

四、三大硬性限制

  1. 字符數限制:M ≤ 65535
  2. 字節數限制:M × max_bytes_per_char + length_prefix ≤ 65535
  3. 行長度限制:單行所有列定義長度之和 ≤ 65535 字節(不含 BLOB/TEXT 溢出頁)

行長度計算示例

CREATE TABLE t (
  a VARCHAR(30000) CHARSET utf8mb4,  -- 30000×4+2 = 120002 字節 → 超限!
  b VARCHAR(30000) CHARSET utf8mb4
) ENGINE=InnoDB;
-- ERROR 1118 (42000): Row size too large (> 65535)

五、超限自動轉換機制

  • VARCHAR(M) 定義超過字節上限 → 自動轉為 MEDIUMTEXT + Warning
  • CHAR(M) 超過 255 → 自動轉為 VARCHAR → 再超限轉 TEXT
  • 建表時務必關注 Warning:SHOW WARNINGS;

六、CHAR vs VARCHAR vs TEXT 選型決策

維度CHAR(M)VARCHAR(M)TEXT
長度特性固定長度,右填充空格變長,實際長度+前綴大變長,1-4字節長度前綴
最大長度255 字符65535 字符 (受行長度限制)4GB (LONGTEXT)
默認值支持支持不支持
索引效率最高 (固定偏移)高需指定前綴長度
適用場景固定代碼:MD5、UUID、ISO 代碼通用業務字段:名稱、地址、描述大文本:文章、日志、JSON 文檔
InnoDB 建議慎用 (佔用固定空間)首選大文本必選

七、utf8mb4 實戰建議

  1. 業務字段:VARCHAR(128)、VARCHAR(255)、VARCHAR(500) 覆蓋 99% 場景,預留餘量。
  2. 大文本:直接 TEXT/MEDIUMTEXT/LONGTEXT,勿嘗試極大 VARCHAR。
  3. 聯合索引:INDEX idx_a_b (a(50), b(20)) 使用前綴索引控制索引大小。
  4. 遷移檢查:SELECT MAX(CHAR_LENGTH(col)), MAX(LENGTH(col)) FROM t; 實際長度分布指導定義調整。

八、總結

VARCHAR(M) 的 M 是字符數上限,實際存儲按字符集字節數計算,受行長度 65535 字節硬性約束。utf8mb4 下單列最大約 16383 字符,多列共存須計算行長度和。選型原則:固定碼用 CHAR、業務變長用 VARCHAR、大文本用 TEXT、InnoDB 首選 VARCHAR。定期審計實際長度分布,精準調整定義,平衡空間與性能。

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