# #1292 – Incorrect datetime value: ‘0000-00-00 00:00:00’

- Link: https://www.xuepaijie.com/html/skill/devops/890.html
- Published: 2017-03-13T15:46:21+08:00
- Author: Admin

发现升级到MySQL 5.7后，这个错误开始发生在随机情况下产生，即便是没有在查询中提供一个
日期。

这似乎是因为早期版本的MySQL支持的日期，例如0000-00-00 00:00:00（默认情况下），然而
5.7.4引入了对NO_ZERO_DATE设置的一些更改。如果在使用较新的MySQL版本时仍然存在旧数据，
则可能会出现随机错误。

需要执行这样的查询将所有零日期重置为另一个日期。

    ```html;
    ＃如果列支持NULL，请使用
    UPDATE table SET date_column = NULL WHERE date_column <'1000-01-01';

    ＃否则提供另一个默认日期
    UPDATE table SET date_column ='1970-01-01' WHERE date_column <'1000-01-01';
    ```

或者，您也可以调整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”，插入将产生警告。

从MySQL 5.7.4起，NO_ZERO_DATE已弃用。在MySQL 5.7.4到5.7.7中，NO_ZERO_DATE明确命名
时不执行任何操作。相反，其效果包含在严格SQL模式的影响中。在MySQL 5.7.8和更高版本
中，NO_ZERO_DATE确实有效果，当明确命名，并不是严格模式的一部分，如MySQL 5.7.4之前。
但是，它应该与严格模式结合使用，并且默认情况下启用。如果启用NO_ZERO_DATE而不启用
严格模式，则会发生警告，反之亦然。有关其他讨论，请参阅MySQL 5.7中的SQL模式更改。

因为NO_ZERO_DATE已被弃用，它将在未来的MySQL发行版中作为单独的模式名称删除，其效果
包括在严格SQL模式的效果中。

从http://dev.mysql.com/doc/refman/5.7/en/sql-mode.html#sqlmode_no_zero_date获取更多
的信息。
