美文网首页
MySQL报错:Incorrect datetime value

MySQL报错:Incorrect datetime value

作者: 手心_d12a | 来源:发表于2020-03-29 17:34 被阅读0次

今天进行网站测试,在导入数据库表时报错,错误提示如下:

[ERR] 1292 - Incorrect datetime value: '0000-00-00 00:00:00' for column 'uptime' ...

大概意思就是:'0000-00-00 00:00:00'对于列 'uptime' 是不正确的 datetime 值...

查了下表里的该字段的定义为: datetime DEFAULT NULL,即类型为 datetime ,默认值设置为  NULL,而在导入文件中插入语句的sql中该字段对应的正是 '0000-00-00 00:00:00',说明错误原因就是无法插入此值造成的。

知道了出错的原因,那下面就是解决办法了,一种办法就是把所有'0000-00-00 00:00:00'都统一改成NULL即可,这个修改了再行导入即可,不再详细说明了。

为了避免使用那么多的NULL(在有NULL的数据操作中确实更容易出问题),另一种解决方案就是让数据库能接受该形式的值。由于导入文件是从其他机器直接导出的,表明在其他机器上的表里保存的正是'0000-00-00 00:00:00'这个值,为什么其他机器上的数据库能保存为此值,而我的却不行呢?

在查询了相关资料(就是百度了一下)后,这个问题跟模式设置(sql_mode)有关。

打开一个查询窗口或在mysql命令行输入代码:

SELECT @@sql_mode;

执行后结果为:

STRICT_ALL_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER

上面的问题就是由于设置模式包含有 NO_ZERO_DATE和NO_ZERO_IN_DATE 造成的。

具体每项设置的含义可以参考:https://www.cnblogs.com/fireporsche/p/8618691.html

参考部分网页上说的,可以使用以下命令修改模式:

set @@sql_mode = 'STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER';

此种修改方式为临时修改,在关闭后重新打开则作用失效。

还有就是直接修改my.ini配置文件,找到sql_mode行,修改为如下重启mysql即可:

sql_mode = 'STRICT_ALL_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER'

(04-10补)

今天又碰到Navicat导入sql失败的问题,报错如下:

[ERR] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'datetime(0) NULL DEFAULT NULL COMMENT '支付时间',  `curriculum_name` varchar(100) ' at line 20
[ERR]

这次虽然报错看着不同了,但其实错误原因跟上面所述还是一致的,都是由于字段设置类型为datetime(0)...导致的,所以就直接修改了mysql配置然后重启服务,重新导入,却依然导入失败。

又试着修改成其他模式值,都不行(其实对这块的配置一直是不太明白),没办法只能换个思路来解决了。

查看了错误提示,定位到sql代码大概是下面这句:

`up_time` datetime(0) NULL DEFAULT NULL COMMENT '更新时间'

后面需要insert的数据,此字段基本都是NULL或'0000-00-00 00:00:00',所以将字段类型直接修改成了int(11),其他不用调整,insert语句就统一修改成NULL,然后重试导入成功。

相关文章

网友评论

      本文标题:MySQL报错:Incorrect datetime value

      本文链接:https://www.haomeiwen.com/subject/tuduuhtx.html