美文网首页Java 杂谈Java学习笔记
MySql系统变量explicit_defaults_for_t

MySql系统变量explicit_defaults_for_t

作者: x_zhaohu | 来源:发表于2017-05-22 19:41 被阅读4721次

之前没太注意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啦~

精彩文章,持续更新,请关注微信公众号:


帅哥美女扫一扫

相关文章

  • MySql系统变量explicit_defaults_for_t

    之前没太注意timestamp这个数据类型,有个坑就是在默认值上,MySql-5.6.6弃用了explicit_d...

  • 30-存储过程-变量

    一、系统变量 1、系统变量分类 1、系统变量由系统定义,不是用户定义,属于 服务器 层面。启动 MySQL ...

  • MySQL 变量的定义

    MySql中的变量定义 根据mysql手册,mysql的变量分为两种:系统变量和用户变量。但是在实际使用中,还会遇...

  • MySql(Win)

    MySql环境变量配置 1.在系统变量中,新建MYSQL_HOME变量,并配置: C:\Program Files...

  • daily -- mysql 基础 变量

    mysql变量 系统变量全局变量回话变量 设置系统变量 自定义变量用户变量只在当前会话有效1. 变量声明初始化3种...

  • Mysql 关于变量

    Mysql 里的变量有 :全局变量、会话变量、局部变量。 全局变量是系统变量:@@global .xxx, sho...

  • Mysql变量

    Mysql变量 之前对mysql的变量概念很模糊, 作为一个有上进心的程序员有必要系统的理一下mysql的变量my...

  • 4. 存储引擎和数据库选项变量

    @@ 系统变量@ 自定义变量无@ 局部变量 Mysql体系架构 1. 存储引擎 InnoDB support fo...

  • mysql中局部变量_MySQL中变量的总结

    本文对MySQL中局部变量、用户变量、系统变量的理解进行总结。 一、局部变量 局部变量由DECLARE语句声明: ...

  • mysql修改数据表自增步长

    可以修改系统变量auto_increment_increment mysql>SHOW VARIABLESLIKE...

网友评论

    本文标题:MySql系统变量explicit_defaults_for_t

    本文链接:https://www.haomeiwen.com/subject/tjdixxtx.html