之前没太注意timestamp这个数据类型,有个坑就是在默认值上,MySql-5.6.6弃用了explicit_defaults_for_timestamp这个系统变量。我的版本却高于5.6.6,所以就掉进去了,囧。
如果你的mysql版本高于5.6.6,在创建下表时,报ERROR 1067 (42000): Invalid default value for 'ctime'
create table mytime (
id int,
atime timestamp not null,
ctime timestamp not null
);
那么恭喜中枪了!
看看mysql官网上的官网解释吧:
timestamp.png
从图中可以看出来,explicit_default_for_timestamp
是解决这个问题的关键点。
当
explicit_defaults_for_timestamp=false
时,按照如下规则"初始化":
off_default_timestamp.png
- 未明确声明为NULL属性的TIMESTAMP列被分配为NOT NULL属性。 (其他数据类型的列,如果未显式声明为NOT NULL,则允许NULL值。)将此列设置为NULL将其设置为当前时间戳。
- 表中的第一个TIMESTAMP列(如果未声明为NULL属性或显式DEFAULT或ON UPDATE子句)将自动分配DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP属性。
- 第一个之后的TIMESTAMP列(如果未声明为NULL属性或显式DEFAULT子句)将自动分配DEFAULT'0000-00-00 00:00:00'(“零”时间戳)。 对于不指定此列的显式值的插入行,该列将分配“0000-00-00 00:00:00”,并且不会发生警告。
当
explicit_defaults_for_timestamp=true
时,按照如下规则"初始化":
no_default_timestamp.png
- 未明确声明为NOT NULL的TIMESTAMP列允许NULL值。 将此列设置为NULL将其设置为NULL,而不是当前时间戳。
所以小伙伴们创建数据库的时候,时间字段不勾选“NOT NULL”就没事。 - 没有TIMESTAMP列自动分配DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP属性。 必须明确指定这些属性。
- 声明为NOT NULL且没有显式DEFAULT子句的TIMESTAMP列被视为没有默认值。 对于不为此列指定显式值的插入行,结果取决于SQL模式。 如果启用了严格的SQL模式,则会发生错误。 如果未启用严格的SQL模式,则会为列分配隐式默认值“0000-00-00 00:00:00”,并发出警告。 这类似于MySQL如何处理其他时间类型,如DATETIME。
解决方法:
在my.cnf中添加或修改explicit_defaults_for_timestamp=true
PS:mysql8版本以上的默认为true,所以各位小伙伴就不用担心了。
注:修改时不一定在my.cnf
中,而是在my.cnf
中指定的文件中,我的是写在指定的子文件中的,一开始修改时也挺蒙圈的,附一段内容,方便查找修改。
mysql_my_cnf.png
修改完文件,使文件生效后,再试试创建上面的表,就ok啦~
可以使用该语句查看:
show variables like '%explicit_defaults_for_timestamp%'; 本文有补充,转载自:https://www.jianshu.com/p/d7d364745173