转载

MySQL中的timestamp类型和explicit_defaults_for_timestamp参数

在MySQL 5.6.6之前,TIMESTAMP列如果没有明确声明NULL属性,默认为NOT NULL,设置TIMESTAMP的列值为NULL,会自动存储为当前timestamp。

表中的第一个TIMESTAMP列,如果没有声明NULL属性、DEFAULT或者 ON UPDATE,会自动分配 DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP 属性。

表中第二个TIMESTAMP列,如果没有声明为NULL或者DEFAULT子句,插入行时没有指明改列的值,该列默认分配0000-00-00 00:00:00且没有警告。

来看一个例子:

环境:
MySQL中的timestamp类型和explicit_defaults_for_timestamp参数

测试过程:

MySQL中的timestamp类型和explicit_defaults_for_timestamp参数

从MySQL5.6.6开始这种默认设置的方法被废弃了。在MySQL启动时会出现以下警告:
MySQL中的timestamp类型和explicit_defaults_for_timestamp参数

  1. [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details).
关闭警告的方法是在my.cnf中加入如下参数:

  1. [mysqld]
  2. explicit_defaults_for_timestamp=1

重启MySQL后错误消失,这时TIMESTAMP的行为如下:

TIMESTAMP如果没有显示声明NOT NULL,是允许NULL值的,可以直接设置改列为NULL,而没有默认填充行为,TIMESTAMP不会默认分配DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP属性。

测试环境:

  1. (root@localhost) [(none)]> select version();
  2. +------------+
  3. | version() |
  4. +------------+
  5. | 5.7.17-log |
  6. +------------+
  7. 1 row in set (0.00 sec)

测试过程:

MySQL中的timestamp类型和explicit_defaults_for_timestamp参数


声明为NOT NULL且没有默认子句的TIMESTAMP列是没有默认值的;往数据表中插入列,又没有给TIMESTAMP列赋值时,如果是严格SQL模式,会抛出一个错误,如果严格SQL模式没有启用,该列会赋值为0000-00-00 00:00:00,同时出现一个警告。

测试过程:
MySQL中的timestamp类型和explicit_defaults_for_timestamp参数


正文到此结束
Loading...