從用戶名、文章內容、JSON 文檔、圖片二進制、枚舉狀態,字串類型無處不在。理解固定/可變長度、字元集/二進制、儲存開銷、索引特性,是 Schema 設計的基本功。
| 類型 | 最大長度 | 儲存開銷 | 長度類型 | 適用場景 |
|---|---|---|---|---|
| CHAR(M) | 255 字符 | M 字節 (固定) | 固定 | MD5、UUID、國籍代碼、手機號、定長代碼 |
| VARCHAR(M) | 65,535 字符 (受行 64KB 限制) | L+1/2 字節 (可變) | 可變 | 名稱、標題、URL、描述、變長文本 |
| TINYBLOB / TINYTEXT | 255 字節/字符 | L+1 字節 | 可變 | 極短二進制/文本 |
| BLOB / TEXT | 65,535 字節/字符 | L+2 字節 | 可變 | 標準二進制/文章內容 |
| MEDIUMBLOB / MEDIUMTEXT | 16,777,215 字節/字符 | L+3 字節 | 可變 | 大文本/圖片/日誌 |
| LONGBLOB / LONGTEXT | 4,294,967,295 字節/字符 | L+4 字節 | 可變 | 超大文檔/視頻/備份 |
| ENUM('v1','v2',...) | 65,535 個成員 | 1-2 字節 | 固定 (索引值) | 單選狀態:性別、訂單狀態、優先級 |
| SET('v1','v2',...) | 64 個成員 | 1-8 字節 | 固定 (位掩碼) | 多選標籤:權限集、文章標籤、功能開關 |
'' (ENUM) 或忽略 (SET),嚴格模式報錯。| 特性 | 二進制 (BLOB, CHAR/VARCHAR BINARY) | 非二進制 (TEXT, CHAR/VARCHAR) |
|---|---|---|
| 比較單位 | 字節 | 字符 |
| 大小寫敏感 | 是 (字節值不同) | 否 (依排序規則,通常不敏感) |
| 字元集相關 | 無 | 有 (utf8mb4, gbk 等) |
| 排序依據 | 字節數值順序 | 字符在字元集中順序 |
| 長度計算 | 字節數 = 字符數 (單字節集) 或不同 | 字符數 (CHAR_LENGTH) vs 字節數 (LENGTH) |
VARCHAR(20) 表示最多 20 字節,而非 20 字符。TEXT。ORDER BY enum_col 可能違背直覺,需 ORDER BY CAST(enum_col AS CHAR)。-- 通用字串欄位模板
`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。