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

MySQL VARCHAR 類型深度解析:長度限制、儲存原理、引擎差異與最佳實踐

     編輯:MySQL 資料庫相關知識

1. VARCHAR(N) 邏輯意義演進

  • MySQL 4.1 前:N 代表**最大位元組數**。
  • MySQL 4.1+:N 代表**最大字元數**(字符數),與字元集無關。一個中文、英文、數字均計 1 字元。

2. 最大長度極限推導

單行上限 65,535 位元組(含所有欄位、長度前綴、NULL 標記)。

單一 VARCHAR 欄位極限

條件最大位元組換算字元數 (latin1/gbk/utf8mb4)
NOT NULL65,53365,533 / 32,766 / 16,383
DEFAULT NULL65,53265,532 / 32,766 / 16,383

計算公式:65535 - 長度前綴(1~2) - NULL標記(0/1) - 其他固定長欄位。

多欄位實例

CREATE TABLE `tv` (
  `a` VARCHAR(100) DEFAULT NULL,
  `b` VARCHAR(100) DEFAULT NULL,
  `c` VARCHAR(100) DEFAULT NULL,
  `d` VARCHAR(100) DEFAULT NULL,
  `e` VARCHAR(100) DEFAULT NULL,
  `f` VARCHAR(100) DEFAULT NULL,
  `g` VARCHAR(100) DEFAULT NULL,
  `h` VARCHAR(100) DEFAULT NULL,
  `i` VARCHAR(N) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
-- N 最大 = 64723 (位元組) = 64723 字元 (latin1)

3. 物理儲存結構

  • 長度前綴:1 位元組(最大長度 < 256 位元組)或 2 位元組(≥256 位元組)。
  • 實際資料:按字元集編碼儲存,不補齊。
  • NULL 標記:每 8 個可為 NULL 欄位共用 1 位元組位圖。

4. InnoDB 儲存行為 (關鍵差異)

File Format / Row FormatVARCHAR 儲存方式
Antelope (Redundant/Compact)聚簇索引僅存**前 768 位元組**,超出部分存 **Overflow Page**,索引存 20 位元組指針。最多 10 個此類大欄位。
Barracuda (Dynamic/Compressed)**全量溢出判斷**:若行長度超過頁面 1/2,優先將最長 VARCHAR 完整移至 Overflow Page,索引僅存 20 位元組指針。支援更多大欄位。

啟用 Barracuda:

SET GLOBAL innodb_file_format = Barracuda;
SET GLOBAL innodb_file_per_table = ON;
CREATE TABLE t (c VARCHAR(10000)) ROW_FORMAT=DYNAMIC;

5. MyISAM 儲存行為

  • Fixed (Static):VARCHAR 按最大長度**定長儲存**,空間浪費,速度快。
  • Dynamic:變長儲存,需長度前綴,支援壓縮 (myisampack)。
  • 無 Overflow Page 機制,所有資料 In-line 儲存。

6. 字元集對長度影響

字元集單字元位元組VARCHAR(65535) 理論上限
latin1165,532 字元
gbk232,766 字元
utf8mb43~416,383 字元

7. 最佳實踐建議

  1. 精確定義長度:業務實際最大長度 + 10% 緩衝,避免 255/65535 盲目上限。
  2. 避免過大 VARCHAR:超過 768 位元組觸發 Off-page,隨機 I/O 影響效能。長文本改用 TEXT/BLOB 或外部儲存。
  3. 啟用 Barracuda + Dynamic:大幅改善大 VARCHAR 儲存效率。
  4. 索引前綴長度:INDEX idx_name (col(20)),避免索引過大、超過 3072 位元組限制。
  5. 字元集統一 utf8mb4:支援 Emoji、生僻字,避免轉碼亂碼。

結語

VARCHAR 看似簡單,實則涉及**字元 vs 位元組、行長度上限、長度前綴、NULL 位圖、InnoDB Off-page、MyISAM Row Format、字元集編碼**等多層機制。深度理解這些細節,能做出精準的表結構設計,避免「能存下但查詢慢」、「遷移報錯」、「索引失效」等生產事故。

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