MySql系统变量explicit_defaults_for_timestamp

之前没太注意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,而不是当前时间戳。
  • 没有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

注:修改时不一定在my.cnf中,而是在my.cnf中指定的文件中,我的是写在指定的子文件中的,一开始修改时也挺蒙圈的,附一段内容,方便查找修改。

mysql_my_cnf.png

修改完文件,使文件生效后,再试试创建上面的表,就ok啦~



作者:x_zhaohu
链接:https://www.jianshu.com/p/d7d364745173
來源:简书

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页