1. 程式人生 > 實用技巧 >mysql之修改sql_mode

mysql之修改sql_mode

問題:1067 - Invalid default value for 'reg_date'

原因:mysql5.7版本中有了一個STRICT mode(嚴格模式),而在此模式下預設是不允許設定日期的值為全0值的

解決:修改sql_mode的值

1、進入到mysql的安裝目錄下的bin目錄,使用管理員使用者登入mysql資料庫。

  使用命令 mysql –h localhost –u root –p 其中-h是指定主機名或IP地址, -u是指定使用者, -p是使用密碼登入。

2、檢視sql_mode的值

select @@sql_mode;
或
select @@session.sql_mode;

全域性級別sql_mode檢視

select @@global.sql_mode; 

通過上圖中的結果我們可以看到sql_mode中有NO_ZERO_IN_DATE和NO_ZERO_DATE。

3、修改sql_mode

set sql_mode=(select replace(@@sql_mode,'NO_ZERO_IN_DATE,NO_ZERO_DATE',''));

修改全域性sql_mode

set @@global.sql_mode=(select replace(@@global.sql_mode,'NO_ZERO_IN_DATE,NO_ZERO_DATE',''));

4、因為MySQL重啟時會重新讀取配置檔案裡對應值,如果需永久生效需要修改配置檔案裡的值。

修改MySQL安裝目錄下的my.ini檔案(Linux版本是my.cnf檔案)中sql_mode的值

5、重啟即可生效。

常見的sql_mode值的介紹:

1)ONLY_FULL_GROUP_BY:出現在SELECT語句、HAVING條件和ORDER BY語句中的列,必須是GROUP BY的列或者依賴於GROUP BY列的函式列。

2)NO_AUTO_VALUE_ON_ZERO:該值影響自增長列的插入。預設設定下,插入0或NULL代表生成下一個自增長值。如果使用者希望插入的值為0,而該列又是自增長的,那麼這個選項就有用了。

3)STRICT_TRANS_TABLES:在該模式下,如果一個值不能插入到一個事務表中,則中斷當前的操作,對非事務表不做限制。

4)NO_ZERO_IN_DATE:這個模式影響了是否允許日期中的月份和日包含0。如果開啟此模式,2016-01-00是不允許的,但是0000-02-01是允許的。

5)NO_ZERO_DATE:設定該值,mysql資料庫不允許插入零日期。

6)ERROR_FOR_DIVISION_BY_ZERO:在INSERT或UPDATE過程中,如果資料被零除,則產生錯誤而非警告。如果未給出該模式,那麼資料被零除時,MySQL返回NULL。

7)NO_AUTO_CREATE_USER:禁止GRANT建立密碼為空的使用者。

8)NO_ENGINE_SUBSTITUTION:如果需要的儲存引擎被禁用或未編譯,那麼丟擲錯誤。不設定此值時,用預設的儲存引擎替代,並丟擲一個異常。

9)PIPES_AS_CONCAT:將”||”視為字串的連線操作符而非或運算子,這和Oracle資料庫是一樣的,也和字串的拼接函式Concat相類似。

10)ANSI_QUOTES:啟用ANSI_QUOTES後,不能用雙引號來引用字串,因為它被解釋為識別符。

參考:https://blog.csdn.net/han_cui/article/details/82497329