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
來源:简书

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值