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

MySQL SET 與 ENUM 類型深度解析:多選與單選的儲存邏輯差異

     編輯:MySQL 資料庫相關知識

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   |
+------+-------+

核心差異:位元遮罩 vs 索引映射

SET:位元運算實現多選

每個元素對應一個二進位位:

元素十進位二進位
x10001
y20010
z40100

插入值 1 → 二進位 0001 → 對應 x;
插入值 4 → 二進位 0100 → 對應 z;
若插入 3 (0011) 則同時包含 x,y。

越界行為:超出定義範圍的位會被忽略(如輸入 8 即 1000,無對應元素,結果為空)。

ENUM:索引映射實現單選

內部以索引(從 1 開始)儲存:

元素索引
NULLNULL
'' (空字串)0
one1
two2
three3

插入值 3 → 索引 3 → three;
插入值 4 → 索引 4 不存在 → 儲存為空字串 (索引 0),顯示為空白。

避坑指南與最佳實踐

  • 嚴格模式下(sql_mode=STRICT_ALL_TABLES),ENUM 越界會直接報錯而非寫入空值。
  • SET 適合「標籤、屬性」等多值場景;ENUM 適合「狀態、類型」等互斥單值場景。
  • 避免在 ENUM 中使用數字作為元素(如 ENUM('0','1')),極易與索引混淆。
  • 需頻繁新增/刪除選項時,建議改用查找表(Foreign Key 關聯),避免 ALTER TABLE 鎖表風險。

理解底層儲存邏輯,才能在設計階段做出正確選型,規避資料異常風險。

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