今天导数据进数据库的时候报错 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