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

MySQL ENUM 與 SET 欄位約束深度解析:從寬鬆模式到嚴格模式

     編輯:MySQL 資料庫相關知識

核心特性對比

特性ENUMSET
儲存結構單值,從預定義列表選一多值,從預定義列表選零或多個(逗號分隔)
預設值若未指定:允許 NULL 時為 NULL,否則為第 1 個枚舉值空字串 ''
非法值處理(非嚴格模式)轉為內部索引 0,顯示為空字串非法子字串被忽略,如 'a,x,b,y' → 'a,b'

MySQL 5.0.2+ 嚴格 SQL 模式(STRICT_TRANS_TABLES / STRICT_ALL_TABLES)

啟用後,ENUM/SET 定義成為**真正約束**:

  • ENUM: 僅接受定義列表中的值或對應數字索引,拒絕 ''、'd'、'ax' 等非法值 → 報錯。
  • SET: 僅接受空字串或定義列表中值的逗號組合,拒絕 'd'、'a,b,c,d' → 報錯。

INSERT/UPDATE IGNORE 降級處理

嚴格模式下加 IGNORE:

  • ENUM:非法值寫入錯誤成員(索引 0,顯示空字串),產生警告而非錯誤。
  • SET:非法子字串被刪除,合法部分寫入(如 'a,x,b,y' → 'a,b'),產生警告。

啟用嚴格模式

-- 配置檔 my.cnf
[mysqld]
sql_mode = STRICT_TRANS_TABLES  # 或 STRICT_ALL_TABLES

-- 或運行時
SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES';

最佳實踐建議

  1. 新專案預設啟用嚴格模式: 盡早暴露資料質量問題。
  2. 應用層驗證優先: 在進資料庫前完成枚舉值校驗,資料庫約束作為最後防線。
  3. 遷移舊系統: 先清洗存量非法資料,再開啟嚴格模式,避免業務中斷。
  4. 文檼化枚舉映射: 代碼中維護常量/枚舉類對應資料庫定義,避免硬編碼字串散落。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved