出错现象
数据库使用的是 MySQL。
引擎启动的时候会自动进行建表。创建表的时候,日志出现错误信息 1067 - Invliad default vlalue for update_date
。
问题排查
使用数据库客户端连接数据库,查询数据库 sql_mode
select @@sql_mode
查询结果中包含 NO_ZERO_IN_DATE、NO_ZERO_DATE
STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
查询变量
show variables like 'explicit_defaults_for_timestamp';
查询结果如下 value 为 OFF
explicit_defaults_for_timestamp OFF
问题简单描述
由于 sql_mode 含有 NO_ZERO_IN_DATE、NO_ZERO_DATE,就是日期和时间类型的字段,不能包含零时间,例如'0000-00-00 00:00:00'
explicit_defaults_for_timestamp 为 OFF,会导致建表语句中,如果有多个 timestamp 字段,并且没有显式地指定为 NULL 或者默认值。MySQL 就会自动给第一个字段之后的字段,加上 DEFAULT '0000-00-00 00:00:0',这跟 NO_ZERO_DATE 是违背的,就会提示最开始的错误。
例如以下建表语句,在 explicit_defaults_for_timestamp 为 OFF 时报错。
CREATE TABLE test(
x int(11) NOT NULL AUTO_INCREMENT,
y timestamp,
z timestamp,
w timestamp,
PRIMARY KEY (x)
) ENGINE=InnoDB;
注意:从 MySQL 8.0.2 开始,explicit_defaults_for_timestamp 默认为 ON。现在部署脚本,安装的 MySQL 版本是 8.0.0。
解决方案
修改 explicit_defaults_for_timestamp 为 ON
在 Linux 系统上,MySQL 的配置文件通常位于 /etc/my.cnf 或 /etc/mysql/my.cnf;在 Windows 系统上,通常位于 C:\Program Files\MySQL\MySQL Server X.X\my.ini。
找到配置文件后,使用文本编辑器打开,并找到 [mysqld] 部分。在该部分添加或修改以下行:
explicit_defaults_for_timestamp = ON