Incorrect datetime value: '0000-00-00 00:00:00' for column 'addtime' at row問題解決


今天導數據進數據庫的時候報錯 Incorrect datetime value: '0000-00-00 00:00:00' for column 'addtime' at row 1

數據是從5.5版本導出的,導入到5.7版本就不行了

原因是受到了服務器sql模式的影響,5.7的模式比5.5的嚴格

 

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在未啟用嚴格模式的情況下啟用了警告, 反之亦然。有關更多討論,請參見 MySQL 5.7中的SQL模式更改。

因為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在未啟用嚴格模式的情況下啟用了警告, 反之亦然。有關更多討論,請參見 MySQL 5.7中的SQL模式更改。

因為NO_ZERO_IN_DATE不推薦使用,所以它將在將來的MySQL版本中作為單獨的模式名稱刪除,並且其影響包括在嚴格SQL模式的影響中。

 

 

  

 

  在MySQL 5.7中, ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE,和 NO_ZERO_IN_DATESQL模式已被棄用。長期計划是將這三種模式包含在嚴格的SQL模式中,並在將來的MySQL版本中將它們作為顯式模式刪除。為了使MySQL 5.7與MySQL 5.6嚴格模式兼容,並為修改受影響的應用程序提供額外的時間,適用以下行為:

ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE和 NO_ZERO_IN_DATE都不是嚴格SQL模式的一部分,但應將它們與嚴格模式一起使用。提醒一下,如果在未啟用嚴格模式的情況下啟用了警告,則會發生警告,反之亦然。

ERROR_FOR_DIVISION_BY_ZERO, NO_ZERO_DATE和 NO_ZERO_IN_DATE是默認啟用的。

  通過上述更改,默認情況下仍會啟用更嚴格的數據檢查,但是可以在當前需要或必須這樣做的環境中禁用各個模式。

 

 

 

問題分析

通過官方文檔的描述,知道問題所在了,在MySQL 5.7中默認啟動NO_ZERO_DATE和 NO_ZERO_IN_DATE在嚴格模式下導入0000-00-00會產生錯誤,接下來就是解決問題的方法了

 

解決方案

第一種 當該字段可以設置NULL值的時候   

update 表名 set 報錯字段 set NULL where 報錯字段 = '0000-00-00 00:00:00'

直接把錯誤時間設置成NULL就可以了

 

第二種 字段不能為NULL

update 表名 set 報錯字段 set ‘1920-02-02’ where 報錯字段 = '0000-00-00 00:00:00'

把錯誤時間設置成一個很久之前的時間

 

第三種 修改mysql模式

sql_mode通過刪除NO_ZERO_DATE和,將更改為允許零日期NO_ZERO_IN_DATE。可以在my.cnf文件中應用此更改,因此,在重新啟動MySQL Server之后,sql_mode變量將被初始化為my.cnf中的設置

 

參考鏈接https://stackoverflow.com/questions/35565128/mysql-incorrect-datetime-value-0000-00-00-000000


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM