升級 mysql5.6 配置文件my.cnf sql_mode 解析與設置問題

sql_mode是個很容易被忽視的變量,默認值是空值,在這種設置下是能夠容許一些非法操做的,好比容許一些非法數據的插入。在生產環境必須將這個值設置爲嚴格模式,因此開發、測試環境的數據庫也必需要設置,這樣在開發測試階段就能夠發現問題 mysql

1.sql_mode值的含義

ONLY_FULL_GROUP_BYsql

對於GROUP BY聚合操做,若是在SELECT中的列,沒有在GROUP BY中出現,那麼將認爲這個SQL是不合法的,由於列不在GROUP BY從句中數據庫

STRICT_TRANS_TABLESsession

在該模式下,若是一個值不能插入到一個事務表中,則中斷當前的操做,對非事務表不作任何限制函數

NO_ZERO_IN_DATE測試

在嚴格模式,不接受月或日部分爲0的日期。若是使用IGNORE選項,咱們爲相似的日期插入'0000-00-00'。在非嚴格模式,能夠接受該日期,但會生成警告。spa

NO_ZERO_DATE命令行

在嚴格模式,不要將 '0000-00-00'作爲合法日期。你仍然能夠用IGNORE選項插入零日期。在非嚴格模式,能夠接受該日期,但會生成警告code

ERROR_FOR_DIVISION_BY_ZEROblog

在嚴格模式,在INSERT或UPDATE過程當中,若是被零除(或MOD(X,0)),則產生錯誤(不然爲警告)。若是未給出該模式,被零除時MySQL返回NULL。若是用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操做結果爲NULL。

NO_AUTO_CREATE_USER

防止GRANT自動建立新用戶,除非還指定了密碼。

NO_ENGINE_SUBSTITUTION

若是須要的存儲引擎被禁用或未編譯,那麼拋出錯誤。不設置此值時,用默認的存儲引擎替代,並拋出一個異常。

mysql5.0以上版本支持三種sql_mode模式:

ANSI模式

寬鬆模式,對插入數據進行校驗,若是不符合定義類型或長度,對數據類型調整或截斷保存,報warning警告。

TRADITIONAL模式

嚴格模式,當向mysql數據庫插入數據時,進行數據的嚴格校驗,保證錯誤數據不能插入,報error錯誤。用於事物時,會進行事物的回滾。

STRICT_TRANS_TABLES模式

嚴格模式,進行數據的嚴格校驗,錯誤數據不能插入,報error錯誤。

咱們能夠經過如下方式查看當前數據庫使用的sql_mode:

mysql> select @@sql_mode;

或者經過查看系統變量方式:
mysql> show variables like 'sql_mode%';

2.今天升級mysql5.6後程序警告

原來mysql 5.6版本後將mysql數據庫的sql_mode默認設置了ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT,ANSI_QUOTES等值,
因此致使以前sql中有group by等函數的sql不能正常執行, 如需解決此問題只需在本地mysql命令行中使用set @@sql_mode
='';便可解決此問題, 可是此方法並非根本解決方案,這樣更改數據庫模式都是session級別的,一次性,當你的mysql再次重啓後又會出現此問題, 因此最根本解決方案是在 /etc/mysql5.*/目錄下數據庫配置文件my.cnf(Windows是my.ini)中的 [mysqld] 下添加 sql_mode='' 而後重啓mysql便可,以下圖:

推薦在my.cnf添加以下配置
[mysqld]
sql_mode='ONLY_FULL_GROUP_BY,NO_AUTO_VALUE_ON_ZERO,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,
ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,PIPES_AS_CONCAT,ANSI_QUOTES'
相關文章
相關標籤/搜索