今天进行网站测试,在导入数据库表时报错,错误提示如下:
[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,然后重试导入成功。
网友评论