SQL Mode 是 MySQL 中一個重要的系統變量,它決定了 MySQL 應遵循的 SQL 語法規則和數據驗證規則。
什么是 SQL Mode
SQL Mode 定義了 MySQL 應該支持的 SQL 語法以及執行數據驗證的方式。通過設置不同的 SQL Mode,可以讓 MySQL 在不同程度上兼容其他數據庫系統,或者啟用更嚴格的數據檢查。
查看當前 SQL Mode
SELECT @@GLOBAL.sql_mode; -- 查看全局 SQL Mode
SELECT @@SESSION.sql_mode; -- 查看當前會話的 SQL Mode
常見的 SQL Mode 選項
-
STRICT_TRANS_TABLES
對事務表啟用嚴格模式,非法數據值會導致錯誤而非警告 -
STRICT_ALL_TABLES
對所有表啟用嚴格模式 -
NO_ZERO_IN_DATE
禁止日期中的月份或日部分為零(如 '2023-00-01') -
NO_ZERO_DATE
禁止 '0000-00-00' 作為有效日期 -
ERROR_FOR_DIVISION_BY_ZERO
除零操作產生錯誤而非 NULL -
ONLY_FULL_GROUP_BY
要求 GROUP BY 子句包含所有非聚合列 -
ANSI_QUOTES
將雙引號視為標識符引用符(類似標準 SQL) -
PIPES_AS_CONCAT
將?||
?視為字符串連接符而非 OR 運算符 -
NO_AUTO_CREATE_USER
禁止 GRANT 自動創建用戶 -
NO_ENGINE_SUBSTITUTION
當指定存儲引擎不可用時產生錯誤而非自動替換
常用的 SQL Mode 組合
-
傳統模式 (TRADITIONAL)
等同于:STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION
-
ANSI 模式
等同于:REAL_AS_FLOAT, PIPES_AS_CONCAT, ANSI_QUOTES, IGNORE_SPACE
-
嚴格模式 (STRICT)
等同于:STRICT_TRANS_TABLES, STRICT_ALL_TABLES
設置 SQL Mode
-
在配置文件中設置(永久生效):
[mysqld] sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
-
動態設置(當前會話):
SET SESSION sql_mode = 'mode1,mode2,...';
-
動態設置(全局):
SET GLOBAL sql_mode = 'mode1,mode2,...';
SQL Mode 的重要性
正確設置 SQL Mode 可以:
-
提高數據完整性
-
確保與其他數據庫系統的兼容性
-
防止不良數據插入
-
使 MySQL 行為更符合標準 SQL
在生產環境中,通常建議使用嚴格模式(TRADITIONAL)以確保數據質量。