【mysql】数据报错: incorrect datetime value ‘0000-00-00 00:00:00‘ f ...

打印 上一主题 下一主题

主题 1531|帖子 1531|积分 4593

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
一、问题原因

时间字段在导入值'0000-00-00 00:00:00'或者添加 NOT NULL的时间字段时,会往mysql添加0值,此时可能出现此报错。
   这是因为当前的MySQL不支持datetime为0,在MySQL5.7版本以上,默认设置sql_mode模式包罗NO_ZERO_DATE, NO_ZERO_IN_DATE,表示系统里DATE类型字段不能为0。
  二、解决方案

2.1 暂时方案,命令行修改,推荐

进入mysql后,执行命令查询当前的模式:
  1. mysql> SELECT @@sql_mode;
复制代码
就可以查到当前系统的sql_mode配置,好比查询结果为:

发现配置里有NO_ZERO_DATE,NO_ZERO_IN_DATE,这时我们可以暂时移除掉为0限制,它只对本次会话有效:
  1. mysql> SET @@sql_mode = 'STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
复制代码
再次查询:
 

   这个方案推荐的理由是,暂时修改不会影响现有的模式和数据安全机制。
  2.2 全局方案,修改my.cnf或者my.ini,不推荐

mysql的配置文件,在windows系统中是 my.ini,其余系统为 my.cnf。
这里以centos为例,打开配置文件my.cnf
  1. > vi /etc/my.cnf
复制代码
如果存在sql_mode,则移除为0限制。
好比本来配置是 sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,NO_ENGINE_SUBSTITUTION,则修改为sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION:

如果不存在sql_mode,则从默认配置文件拷贝一个过来,并移除为0限制即可,最终配置如上图所示,在节点mysqld下。
   这个方案不推荐的理由是,直接修改了sql_mode模式,允许0值存在。
  对于字段,我们尽量做到不为null,如果从业务来说可以为空,则为空时设置默认的时间即可。这样从代码和数据优化来说都比较好理解和操作。
  2.3 字段类型转换方案,不推荐

也有网友提供了这个方案,先把字段设置成varchar格式,导入数据或者执行命令后,再把字段转换成date格式:
  1. -- 先把字段 clm_date 转换成varchar
  2. mysql> ALTER TABLE tbl_tmp CHANGE clm_date clm_date VARCHAR(20) NULL;
  3. -- 导入数据或者执行相关命令
  4. -- ...
  5. -- 再把字段 clm_date 的类型转换回datetime
  6. mysql> ALTER TABLE tbl_tmp CHANGE clm_date clm_date DATETIME NOT NULL;
复制代码
  这里不推荐的理由,一样平常来说有了第一种方案,也就没须要举行类型转换。有一种情况就是,如果没有权限设置sql_mode,但是可以举行表格的modify,此时这种方案是可行的。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

慢吞云雾缓吐愁

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表