mysql日期時間設置默認0000-00-00 00:00:00出錯

在解決問題之前,我們要先了解一下mysql的嚴格模式和非嚴格模式,有興趣可以自己查看一下官方文檔

嚴格模式

顧名思義,就是比非嚴格模式更爲嚴格,主要就是對數據的要求更爲嚴格,比如數據的類型,長度,格式等。比如一個整型字段我們寫入一個字符串類型的數據,在非嚴格模式下MySQL不會報錯,同樣如果定義了char或varchar類型的字段,當寫入或更新的數據超過了定義的長度也不會報錯。還有一些關於null的數據問題,也可能是因爲嚴格模式造成的,不過我沒遇到過,就跳過這個問題┓( ´∀` )┏

個人推薦,開啓嚴格模式,畢竟也算是對我們代碼的一種測試,嚴格一點總好過項目完成後出問題再大改好。

首先,通過

SELECT @@GLOBAL.sql_mode;       //查看MySQL的全局模式
SELECT @@SESSION.sql_mode;      //查看MySQL的當前連接的模式,如果當前連接模式與全局模式不一致,關閉連接後再連接就一致了

這兩個語句查看你是否處於嚴格模式,如果查詢結果中有

STRICT_TRANS_TABLES

這個類型就代表你開啓了嚴格模式(看了別人的文章貌似還要跟ONLY_FULL_GROUP_BY組合纔算?這個不清楚)

如果沒有,就可以通過以下兩種方式打開嚴格模式:

1.修改配置文件

找到mysql安裝目錄下的my.cnf(windows系統則是my.ini)文件
在sql_mode中加入STRICT_TRANS_TABLES則表示開啓嚴格模式,如沒有加入則表示非嚴格模式,修改後重啓mysql即可

2.在查詢中設置

先查看一下當前你的sql_mode,然後複製查詢結果,把STRICT_TRANS_TABLES加到開頭就可以了

執行以下兩個語句中的一個,根據自身情況修改(推薦瞭解一下這些變量,都挺容易記的,記住了就可以按需使用了):

SET GLOBAL sql_mode = STRICT_TRANS_TABLES,你的查詢結果;
SET SESSION sql_mode = STRICT_TRANS_TABLES,你的查詢結果;

 
 
 
 

然後我們就可以進入正題了

執行

SELECT @@SESSION.sql_mode;      //查看MySQL的當前連接的模式,如果當前連接模式與全局模式不一致,關閉連接後再連接就一致了

查詢結果中有NO_ZERO_DATE和NO_ZERO_IN_DATE,就是我們日期不能設爲0000-00-00的原因了

只要通過修改mysql的模式就可以了,參照上面的設置方法,根據自己情況選擇session還是global,把這兩個變量去掉就可以了。

還有一個方法,不過無法設置默認值,只能在修改數據時生效,就是將INSERT換成INSERT INGORE,UPDATE換成UPDATE INGORE,不過這樣會導致錯誤的數據也可以進入數據庫,不推薦使用

 
 
 

此處貼一下官方的介紹:

  • NO_ZERO_DATE

該NO_ZERO_DATE模式會影響服務器是否允許 '0000-00-00’作爲有效日期。它的效果還取決於是否啓用了嚴格的SQL模式。

    • 如果未啓用此模式, '0000-00-00’則允許並且插入不會產生警告。
    • 如果啓用此模式,‘0000-00-00’ 則允許並且插入產生警告。
    • 如果啓用此模式和嚴格模式, '0000-00-00’則不允許插入產生錯誤,除非 IGNORE同時給出。對於 INSERT IGNORE和UPDATE IGNORE,'0000-00-00’允許和插入產生警告。

NO_ZERO_DATE已棄用。NO_ZERO_DATE 不是嚴格模式的一部分,但應與嚴格模式一起使用,默認情況下啓用。如果NO_ZERO_DATE啓用但未啓用嚴格模式,則會發出警告, 反之亦然。

因爲NO_ZERO_DATE已棄用,它將在未來的MySQL版本中作爲單獨的模式名稱刪除,其效果包含在嚴格SQL模式的效果中。

  • NO_ZERO_IN_DATE

該NO_ZERO_IN_DATE模式會影響服務器是否允許年份部分爲非零但月份或日期部分爲0的日期。(此模式會影響日期,例如’2010-00-01’或 ‘2010-01-00’,但不會 ‘0000-00-00’。要控制服務器是否允許’0000-00-00’,請使用 NO_ZERO_DATE模式。)效果的NO_ZERO_IN_DATE 還取決於是否啓用嚴格的SQL模式。

    • 如果未啓用此模式,則允許零件的日期,並且插入不會產生警告。
    • 如果啓用此模式,則插入零件的日期’0000-00-00’並生成警告。
    • 如果啓用此模式和嚴格模式,則不允許零件的日期,並且插入會產生錯誤,除非IGNORE同時給出。對於INSERT IGNORE和 UPDATE IGNORE,插入零件的日期’0000-00-00’並生成警告。

NO_ZERO_IN_DATE已棄用。 NO_ZERO_IN_DATE不是嚴格模式的一部分,但應與嚴格模式一起使用,默認情況下啓用。如果NO_ZERO_IN_DATE啓用但未啓用嚴格模式,則會發出警告, 反之亦然。

因爲NO_ZERO_IN_DATE已棄用,它將在未來的MySQL版本中作爲單獨的模式名稱刪除,其效果包含在嚴格SQL模式的效果中。
 
 
 

機翻見諒,不過大概是能看懂的,最後的意思大概是,這兩個屬性將會被刪除,以後將直接包含在嚴格模式中了,也就是說以後的mysql開啓了嚴格模式就沒辦法設置0000-00-00 00:00:00了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章