zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Android 通用获取Ip的方法(判断手机是否联网的方法)!!!
    android intent和intent action大全
    手机信息
    Android 获取信号强度
    android 基站定位
    Android 读取SIM卡参数
    Android 获取手机SIM资料详解
    Android手机中获取手机号码和运营商信息
    java中的url 编码与解码
    java.util.Scanner的日常用法
  • 原文地址:https://www.cnblogs.com/1010wjf/p/13163164.html
Copyright © 2011-2022 走看看