萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 5.6 sql_mode 配置詳解:會話級、全局級與持久化最佳實踐

查看當前 sql_mode


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_BYGROUP 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相容模式別名組合

5.6 安裝陷阱:mysql_install_db 自動寫入預設 sql_mode

執行 mysql_install_db 會在安裝目錄生成 my.cnf,預設寫入:


sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES

若遷移自 5.5,舊應用可能因嚴格模式報錯(如日期零值、分組不全)。解決:

  1. 修改 /usr/local/mysql/my.cnf 或 /etc/my.cnf 覆蓋
  2. 重啟驗證 SELECT @@GLOBAL.sql_mode;

遷移建議

  • 新專案:啟用嚴格模式 + ONLY_FULL_GROUP_BY,從源頭保證數據質量
  • 舊專案遷移:先在測試環境開啟,收集報錯日誌,逐一修正應用 SQL,再推生產
  • 使用 sql_mode='' 關閉所有模式屬於「掩耳盜鈴」,強烈不建議
copyright © 萬盛學電腦網 all rights reserved