SET 與 ENUM 同屬字串物件類型,但集合操作邏輯截然不同: SET 支援多選(最多 64 元素),ENUM 單選(最多 65535 元素)。本文通過實戰案例拆解兩者的儲存機制與越界行為。
CREATE TABLE db_set (
set1 SET('x','y','z') NOT NULL,
enum1 ENUM('one','two','three') NOT NULL
);
INSERT INTO db_set VALUES (1,3), (1,4), (4,1);
SELECT * FROM db_set;
輸出結果:
+------+-------+
| set1 | enum1 |
+------+-------+
| x | three |
| x | |
| z | one |
+------+-------+
每個元素對應一個二進位位:
| 元素 | 十進位 | 二進位 |
|---|---|---|
| x | 1 | 0001 |
| y | 2 | 0010 |
| z | 4 | 0100 |
插入值 1 → 二進位 0001 → 對應 x;
插入值 4 → 二進位 0100 → 對應 z;
若插入 3 (0011) 則同時包含 x,y。
越界行為:超出定義範圍的位會被忽略(如輸入 8 即 1000,無對應元素,結果為空)。
內部以索引(從 1 開始)儲存:
| 元素 | 索引 |
|---|---|
| NULL | NULL |
| '' (空字串) | 0 |
| one | 1 |
| two | 2 |
| three | 3 |
插入值 3 → 索引 3 → three;
插入值 4 → 索引 4 不存在 → 儲存為空字串 (索引 0),顯示為空白。
sql_mode=STRICT_ALL_TABLES),ENUM 越界會直接報錯而非寫入空值。ENUM('0','1')),極易與索引混淆。ALTER TABLE 鎖表風險。理解底層儲存邏輯,才能在設計階段做出正確選型,規避資料異常風險。