最新消息: 新版网站上线了!!!

linux nacicat导入mysql数据库错误Invalid default value for 'date_added'(sql_mode值的原因 )

一、问题详情
Linux服务器下,mysql版本5.7.22
导入数据库提示错误[Err] 1067 - Invalid default value for 'date_added'
查找字段date_added,发现结果为`date_added` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
完整脚本:
DROP TABLE IF EXISTS `attachments`;
CREATE TABLE `attachments` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `fk_id` varchar(10) NOT NULL DEFAULT '0',
  `fk_table` varchar(250) DEFAULT '',
  `title` varchar(250) DEFAULT '',
  `description` varchar(250) DEFAULT '',
  `file_name` varchar(250) NOT NULL DEFAULT '',
  `file_path` varchar(250) DEFAULT '',
  `file_size` int(11) NOT NULL DEFAULT '0',
  `file_type` varchar(250) NOT NULL DEFAULT '',
  `date_added` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `content` longblob,
  `compression_type` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

二、原因
网上查询说与NO_ZERO_IN_DATE和NO_ZERO_DATE有关系
1、NO_ZERO_IN_DATE:
在严格模式,不接受月或日部分为0的日期。如果使用IGNORE选项,我们为类似的日期插入'0000-00-00'。在非严格模式,可以接受该日期,但会生成警告。

2、NO_ZERO_DATE:
在严格模式,不要将 '0000-00-00'做为合法日期。你仍然可以用IGNORE选项插入零日期。在非严格模式,可以接受该日期,但会生成警告

三、验证NO_ZERO_IN_DATE和NO_ZERO_DATE
mysql执行select @@sql_mode;
结果:ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
果然里面有NO_ZERO_IN_DATE,NO_ZERO_DATE

四、解决办法
修改my.cnf中的sql_mode值,如果没有sql_mode,就自己添加,添加时去掉NO_ZERO_IN_DATE,NO_ZERO_DATE这2个值,切记写在[mysqld]的下面不然不起作用,如下
[mysqld]
sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION;

五、结果
数据库成功导入,没有出现类型这样的错误[Err] 1067 - Invalid default value for 'date_added'.....

转载请注明:谷谷点程序 » linux nacicat导入mysql数据库错误Invalid default value for 'date_added'(sql_mode值的原因 )