MySQL 除常用數值/字串/日期類型外,還提供 ENUM、SET、多種二進制類型。本文詳細解析其存儲原理、索引映射、取值限制、尾部空格處理差異,並給出「如何選擇數據類型」六大維度決策框架。
col ENUM('v1','v2',...,'vn')NULL→NULL、''→0、'v1'→1...CREATE TABLE t (level ENUM('excellent','good','bad'));
INSERT INTO t VALUES ('good'), (1), (2), (3); -- 1/2/3 自動映射為對應枚舉值
-- INSERT INTO t VALUES ('best'); -- Warning: Data truncated, 存空串
col SET('v1','v2',...,'vn')'v1,v3'CREATE TABLE t (tags SET('a','b','c'));
INSERT INTO t VALUES ('a,b'), ('b,a'), ('a,a,b'); -- 存儲均為 'a,b'
SELECT * FROM t; -- 輸出 a,b / a,b / a,b
| 類型 | 最大長度 | 用途 |
|---|---|---|
| BIT(M) | M bits (1-64) | 位掩碼、布爾組合 |
| BINARY(N) | N bytes (0-255) | 定長二進制,如 MD5、UUID |
| VARBINARY(N) | N bytes (0-65,535) | 變長二進制,文件流片段 |
| TINYBLOB | 255 B | 極小二進制對象 |
| BLOB | 64 KB | 圖片、小文件 |
| MEDIUMBLOB | 16 MB | 音頻、大文檔 |
| LONGBLOB | 4 GB | 視頻、巨型文件 |
對應非二進制文本類型:TINYTEXT/TEXT/MEDIUMTEXT/LONGTEXT,字符集相關,不直接存二進制。
DECIMAL;科學計算可接受誤差用 FLOAT/DOUBLE。避免 FLOAT(M,D) 非標準語法。YEAR;僅時間用 TIME;日期+時間用 DATETIME(範圍大)或 TIMESTAMP(自動更新、範圍小至 2038)。CHAR(MyISAM 靜態表更快);可變長用 VARCHAR 節省空間。InnoDB 不區分存儲格式,推薦 VARCHAR。ENUM;多選用 SET。BLOB;純文本用 TEXT。JSON 類型。ENUM 索引值從 1 起,ORDER BY enum_col 按索引排序而非字面值排序。SET 成員超過 64 會報錯,改用關聯表或 JSON。BLOB/TEXT 不能有默認值,GROUP BY/ORDER BY 只用前 max_sort_length 字節(預設 1024)。CHAR 尾部空格會被截斷,VARCHAR 保留,比較時需注意 PAD_CHAR_TO_FULL_LENGTH SQL 模式影響。