ENUM(Enumeration) 是 MySQL 特有的字串物件類型,其值必須從建表時預先定義的「允許值列表」中選取。它將字串值在內部以整數索引(1, 2, 3...)儲存,兼具字串可讀性與整數查詢效能,適用於狀態碼、分類標籤等固定選項場景。
ENUM('pending', 'paid', 'shipped')。WHERE enum_col = 0 快速找出髒資料。NOT NULL,預設值為第一個列舉成員(索引 1)。以 ENUM('one', 'two', 'three') 為例:
| 實際值 | 索引值 |
|---|---|
| NULL | NULL |
| "" (空字串) | 0 |
| "one" | 1 |
| "two" | 2 |
| "three" | 3 |
單一 ENUM 欄位最多支援 65,535 個不同成員值。
插入資料時 'One'、'ONE'、'one' 皆視為同一值;但 SELECT 時回傳的大小寫完全依照建表定義(此例為 'one')。
SELECT enum_col + 0 FROM tbl; → 回傳索引值(整數)。INSERT INTO tbl (enum_col) VALUES (2); → 寫入索引 2 對應的字串 'two'。LOAD DATA 視所有輸入為字串,不支援 直接寫入數值索引。ENUM 依「定義順序(索引順序)」排序,而非字母順序。
例:ENUM('b', 'a') 中 'b' (索引1) 排在 'a' (索引2) 前面。
最佳實踐: 定義時按字母或業務邏輯順序排列,或查詢時用 ORDER BY CONCAT(enum_col) 強制字母序。
SHOW COLUMNS FROM table_name LIKE 'enum_column';
SELECT * FROM tbl WHERE enum_col = 0;
| 優點 | 缺點/注意事項 |
|---|---|
| 儲存緊湊(1-2 bytes),查詢快 | 修改列舉值需 ALTER TABLE,大表會鎖表 |
| 資料完整性:僅允許白名單值 | 不支援外鍵關聯,無法像查閱表那樣 JOIN |
| 語意清晰,程式碼可直接對應常數 | 排序依定義順序,易造成誤解 |
| 可直接用數值索引寫入/讀出 | LOAD DATA、部分 ORM 不支援索引寫入 |
CHECK 條件約束,可進一步限制值域。ENUM 是「固定選項、高頻讀取、極少變更」欄位的高效選擇。掌握其索引機制、排序行為與特殊值(索引 0 的空字串),能避開常見坑點。若業務需彈性擴充或關聯查詢,請改用獨立查閱表配合外鍵設計。