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

MySQL 字串類型深度解析:CHAR/VARCHAR/TEXT/BLOB/ENUM/SET 儲存特性與選型指南

     編輯:MySQL 資料庫相關知識

前言:字串類型是資料庫的通用語言

從用戶名、文章內容、JSON 文檔、圖片二進制、枚舉狀態,字串類型無處不在。理解固定/可變長度、字元集/二進制、儲存開銷、索引特性,是 Schema 設計的基本功。

一、字串類型完整對比表

類型最大長度儲存開銷長度類型適用場景
CHAR(M)255 字符M 字節 (固定)固定MD5、UUID、國籍代碼、手機號、定長代碼
VARCHAR(M)65,535 字符 (受行 64KB 限制)L+1/2 字節 (可變)可變名稱、標題、URL、描述、變長文本
TINYBLOB / TINYTEXT255 字節/字符L+1 字節可變極短二進制/文本
BLOB / TEXT65,535 字節/字符L+2 字節可變標準二進制/文章內容
MEDIUMBLOB / MEDIUMTEXT16,777,215 字節/字符L+3 字節可變大文本/圖片/日誌
LONGBLOB / LONGTEXT4,294,967,295 字節/字符L+4 字節可變超大文檔/視頻/備份
ENUM('v1','v2',...)65,535 個成員1-2 字節固定 (索引值)單選狀態:性別、訂單狀態、優先級
SET('v1','v2',...)64 個成員1-8 字節固定 (位掩碼)多選標籤:權限集、文章標籤、功能開關

二、核心特性深度解析

1. 可變長度儲存機制 (L+1/2/3/4)

  • 長度前綴: 1 字節 (≤255)、2 字節 (>255)、3 字節 (>65535)、4 字節 (>16M)。
  • MySQL 讀寫時同時處理內容與長度,故可變類型有微小 CPU 開銷。
  • 超過最大長度自動截斷 (SQL Mode 非嚴格模式) 或報錯 (嚴格模式)。

2. ENUM / SET 內部編碼

  • ENUM:成員按定義順序編號 1,2,3...,儲存數字索引,空間極省。
  • SET:每個成員佔 1 bit,組合成位掩碼整數儲存,最多 64 成員 → 8 字節。
  • 插入非列表值 → 轉為空字串 '' (ENUM) 或忽略 (SET),嚴格模式報錯。

3. 二進制 vs 非二進制字串

特性二進制 (BLOB, CHAR/VARCHAR BINARY)非二進制 (TEXT, CHAR/VARCHAR)
比較單位字節字符
大小寫敏感是 (字節值不同)否 (依排序規則,通常不敏感)
字元集相關無有 (utf8mb4, gbk 等)
排序依據字節數值順序字符在字元集中順序
長度計算字節數 = 字符數 (單字節集) 或不同字符數 (CHAR_LENGTH) vs 字節數 (LENGTH)

4. 多字節字元集下的 VARCHAR 長度陷阱

  • VARCHAR(20) 表示最多 20 字節,而非 20 字符。
  • utf8mb4 中文字符佔 3-4 字節 → 實際只能存 5-6 個中文字符。
  • 解決:按字符數 × 最大字節數 設定長度,或改用 TEXT。

三、CHAR vs VARCHAR 選型決策樹

  1. 長度完全固定 (差異 ≤ 2 字符) → CHAR (MyISAM/MEMORY 效能優、InnoDB 無差)。
  2. 長度變化大 → VARCHAR (節省空間、減少 I/O)。
  3. 表中存在任何可變長度欄位 → 全表行格式變為可變 (InnoDB Dynamic/Compressed),CHAR 也按實際長度儲存 (除非 < 4 字符)。
  4. MyISAM 靜態表 (全 CHAR) → 掃描極快、易緩存、崩潰易恢複,但佔空間大。

四、BLOB vs TEXT 選型

  • 純二進制 (圖片、加密串、壓縮包) → BLOB (無字元集驗證、比較快)。
  • 文本內容 (文章、日誌、JSON) → TEXT (支援字元集、全文索引、排序規則)。
  • 大物件 (>1MB) 建議存檔案系統/對象存儲,資料庫只存路徑/Hash,避免緩存污染、備份膨脹、複寫延遲。

五、ENUM/SET 實戰最佳實踐

  • ENUM 替代 TINYINT + 應用層常量:資料庫層自帶約束、可讀性強、空間極小。
  • SET 替代多欄位 BOOLEAN / 關聯表:單欄位表達多選、位運算極快。
  • 修改成員列表需 ALTER TABLE (Metadata Lock),大表慎用,考慮查找表替代。
  • 排序陷阱: ENUM 按定義順序排序,非字母順序。ORDER BY enum_col 可能違背直覺,需 ORDER BY CAST(enum_col AS CHAR)。

六、現代化建議:統一 utf8mb4 + 合理長度

-- 通用字串欄位模板
`name` VARCHAR(100) NOT NULL DEFAULT '' COMMENT '名稱',
`description` VARCHAR(500) DEFAULT NULL COMMENT '描述',
`content` MEDIUMTEXT COMMENT '正文',
`avatar` VARCHAR(255) DEFAULT NULL COMMENT '頭像URL',
`status` ENUM('active','inactive','banned') NOT NULL DEFAULT 'active' COMMENT '狀態',
`tags` SET('tech','life','work','study') DEFAULT NULL COMMENT '標籤',
`extra` JSON COMMENT '擴展屬性 (MySQL 5.7+)'
-- 所有字串欄位隱含 CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci

結語

字串類型選型看似瑣碎,實則決定儲存空間、索引大小、查詢效能、應用層型別映射、國際化支援。掌握「固定用 CHAR、變長用 VARCHAR、大文本用 TEXT/JSON、二進制用 BLOB、枚舉用 ENUM/SET」六大口訣,配合 utf8mb4 全鏈路,即可設計出既省資源又好維護的 Schema。

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