#1292 - Incorrect datetime value: '0000-00-00 00:00:00'

发现升级到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获取更多的信息。

相关推荐:
这个东西的比较主要从以下两个方面来看, INSERT IGNORE 与 INSERT INTO 的区别就是 INSERT IGNORE 会忽略数据库中已经存在 的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数 …
可能很多人在MySQL 8.0中修改密码时遇到了很多问题,比如重置密码,还是用的旧的命令去修改密码,导致报错,因为 MySQL 5.7.6 以后废弃了 user 表中的 password 字段和 password() 方法,所以使用旧的方法 …
当往数据库中插入语句时,连接池抛出了“com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'xxx' at row xxx”的异常。 从提示的信息表面上来看,说是什么数据对于列“xxx”过 …
现在的第三方远程数据库管理可视化工具比较多,如:Navicat、SQLyog、MySQL workbench 等,但发现正确的账户信息连接时报 2059 错误,怎么了?这是因为 MySql8.0 版本 和 5.0 的加密规则不一样,而现在的可 …
拿起手机扫一扫即可带走我!