explicit_defaults_for_timestamp - xiaoboluo768/qianjinliangfang GitHub Wiki
- 在MySQL中,TIMESTAMP数据类型与其他数据类型不同
- 在该参数出现以前,timestamp数据类型有如下特性,这些特性与其他数据类型相比,是非标准的行为:
- 未明确声明为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”值,并且不会发生警告
- 从MySQL 5.6.6开始,可以使用配置参数explicit_defaults_for_timestamp关闭timestamp数据类型的非标准行为,如果不设置explicit_defaults_for_timestamp,在server启动时错误日志中会出现此警告:[Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more details)。启用此变量后,服务器处理TIMESTAMP的规则如下:
- 未明确声明为NOT NULL的TIMESTAMP列将允许为NULL。将此列设置为NULL之后,再对此列插入NULL时就是null值,而不是当前时间戳
- 不再为第一个TIMESTAMP列自动分配DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP属性。如果要使用这些属性则必须明确指定
- 不再为后续未声明为NULL属性或显式设置DEFAULT子句的TIMESTAMP列自动分配DEFAULT'0000-00-00 00:00:00',在开启这个参数之后,声明为NOT NULL且没有显式DEFAULT子句的TIMESTAMP列被视为没有默认值。对于插入时没有显式指定该列的操作时,如何处理取决于SQL模式。如果启用了严格的SQL模式,则会发生错误。如果未启用严格的SQL模式,则会为列分配隐式默认值“0000-00-00 00:00:00”,并发出警告。这MySQL如何处理其他时间类型类似,如DATETIME。
- 注意:explicit_defaults_for_timestamp本身已被弃用,它的唯一目的是用于控制在将来的MySQL版本中将被删除的且现在已经不推荐使用的TIMESTAMP数据类型的非标准行为。如果timestamp数据类型的非标准行为被删除,则explicit_defaults_for_timestamp配置参数将没有任何用处,也会同时被删除掉。在5.6.6开始,timestamp数据类型在内部被当作int处理。
- 全局,会话,动态变量,布尔型,默认值为false。5.6.6版本引入,同时废弃掉了timestamp数据类型的非标准行为
- 在该参数出现以前,timestamp数据类型有如下特性,这些特性与其他数据类型相比,是非标准的行为:
上一篇:default_storage_engine | 下一篇:sql_safe_updates