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

MySQL ENUM與SET型別深度解析:從隱性約束到嚴格模式

     編輯:MySQL 資料庫相關知識

ENUM與SET本質:非真正約束

MySQL 5.0.2以前,ENUM/SET不具備真正約束效力(同NOT NULL早期行為)。插入非法值時:

  • ENUM:寫入保留值0(字串顯示為空字串)
  • SET:忽略非法子字串,如SET('a','b','c')插入'a,x,b,y'實際存'a,b'

ENUM預設值規則

  • 允許NULL且未指定預設值 → 預設為NULL
  • NOT NULL或指定預設值 → 第一個列舉值為預設值

嚴格SQL模式(Strict SQL Mode)啟用後的約束行為

MySQL 5.0.2+可配置嚴格模式,開啟後ENUM/SET成為真正約束:

ENUM約束規則

  • 值必須為定義列表中的之一(或對應數字索引)
  • 拒絕錯誤值(0、空字串)
  • 例:ENUM('a','b','c')拒絕''、'd'、'ax'

SET約束規則

  • 值為空字串,或由定義值以逗號分隔組成
  • 例:SET('a','b','c')拒絕'd'、'a,b,c,d'

INSERT IGNORE / UPDATE IGNORE在嚴格模式下的行為

  • 產生警告而非錯誤
  • ENUM:插入錯誤成員(值0)
  • SET:插入給定值,但移除非法子字串('a,x,b,y'→'a,b')

啟用嚴格模式方式

# 配置檔
[mysqld]
sql_mode = STRICT_TRANS_TABLES,STRICT_ALL_TABLES

# 或執行階段動態設定
SET sql_mode = 'STRICT_TRANS_TABLES,STRICT_ALL_TABLES';
最佳實務:新專案建議預設啟用嚴格模式,配合應用層驗證,確保資料完整性。舊專案遷移時需先清理髒資料再開啟,避免業務中斷。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved