发现升级到MySQL 5.7后,这个错误开始发生在随机情况下产生,即便是没有在查询中提供一个日期。
这似乎是因为早期版本的MySQL支持的日期,例如0000-00-00 00:00:00(默认情况下),然而5.7.4引入了对NO_ZERO_DATE设置的一些更改。如果在使用较新的MySQL版本时仍然存在旧数据,则可能会出现随机错误。
需要执行这样的查询将所有零日期重置为另一个日期。
#如果列支持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获取更多的信息。