SELECT @@sql_mode;
-- 5.6 預設:STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION
| 層級 | 語法 | 生效範圍 | 持久性 |
|---|---|---|---|
| 會話級 | SET SESSION sql_mode='...'; | 當前連線 | 斷開失效 |
| 全局級 | SET GLOBAL sql_mode='...'; | 新連線(需 SUPER 權限) | 重啟失效 |
| 配置檔 | my.cnf [mysqld] sql_mode=... | 所有連線 | 永久生效 |
SET SESSION sql_mode='NO_FIELD_OPTIONS,HIGH_NOT_PRECEDENCE';
SELECT @@sql_mode;
SET GLOBAL sql_mode='NO_FIELD_OPTIONS,HIGH_NOT_PRECEDENCE';
vi /etc/my.cnf
[mysqld]
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
# 或自定義組合
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
service mysqld restart
| 模式 | 作用 |
|---|---|
| STRICT_TRANS_TABLES | 嚴格模式:非法數據報錯而非截斷/警告 |
| ONLY_FULL_GROUP_BY | GROUP BY 必須包含所有非聚合列(5.7+ 預設開啟) |
| NO_ZERO_IN_DATE / NO_ZERO_DATE | 禁止 '0000-00-00' 等零日期 |
| ERROR_FOR_DIVISION_BY_ZERO | 除零報錯而非返回 NULL |
| NO_AUTO_CREATE_USER | 禁止 GRANT 隱式建立用戶(5.7+ 已移除) |
| NO_ENGINE_SUBSTITUTION | 指定引擎不可用時不自動降級 |
| ANSI / MYSQL40 | 相容模式別名組合 |
執行 mysql_install_db 會在安裝目錄生成 my.cnf,預設寫入:
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
若遷移自 5.5,舊應用可能因嚴格模式報錯(如日期零值、分組不全)。解決:
/usr/local/mysql/my.cnf 或 /etc/my.cnf 覆蓋SELECT @@GLOBAL.sql_mode;sql_mode='' 關閉所有模式屬於「掩耳盜鈴」,強烈不建議