MySQL 5.0.2以前,ENUM/SET不具備真正約束效力(同NOT NULL早期行為)。插入非法值時:
SET('a','b','c')插入'a,x,b,y'實際存'a,b'MySQL 5.0.2+可配置嚴格模式,開啟後ENUM/SET成為真正約束:
ENUM('a','b','c')拒絕''、'd'、'ax'SET('a','b','c')拒絕'd'、'a,b,c,d''a,x,b,y'→'a,b')# 配置檔
[mysqld]
sql_mode = STRICT_TRANS_TABLES,STRICT_ALL_TABLES
# 或執行階段動態設定
SET sql_mode = 'STRICT_TRANS_TABLES,STRICT_ALL_TABLES';
最佳實務:新專案建議預設啟用嚴格模式,配合應用層驗證,確保資料完整性。舊專案遷移時需先清理髒資料再開啟,避免業務中斷。