zoukankan      html  css  js  c++  java
  • explicit_defaults_for_timestamp 参数说明

    官方文档:

    https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_explicit_defaults_for_timestamp

    命令行格式 --explicit-defaults-for-timestamp[={OFF|ON}]
    已弃用 是的
    系统变量 explicit_defaults_for_timestamp
    范围 全局,会话
    动态的 是的
    类型 布尔值
    默认值 OFF

    说明 :

    此系统变量确定服务器是否为列中的默认值和NULL-value 处理 启用某些非标准行为 TIMESTAMP默认情况下, explicit_defaults_for_timestamp 禁用,这将启用非标准行为。

    如果 explicit_defaults_for_timestamp 禁用,则服务器启用非标准行为并按TIMESTAMP如下方式处理列:

    • TIMESTAMP未使用NULL 属性显式声明的列会自动使用该NOT NULL属性声明NULL允许为这样的列分配值,并将该列设置为当前时间戳。

    • TIMESTAMP表中 的第一列如果没有用NULL属性或显式 DEFAULTON UPDATE 属性显式声明 ,则自动用DEFAULT CURRENT_TIMESTAMP和 ON UPDATE CURRENT_TIMESTAMP属性声明 

    • TIMESTAMP第一个列之后的列,如果未使用NULL属性或显式 DEFAULT属性显式声明 ,则自动声明为DEFAULT '0000-00-00 00:00:00'时间戳)。对于没有为此类列指定显式值的插入行,将分配该列'0000-00-00 00:00:00'并且不会发生警告。

      根据是否NO_ZERO_DATE启用了严格 SQL 模式或 SQL 模式,默认值'0000-00-00 00:00:00'可能无效。请注意, TRADITIONALSQL 模式包括严格模式和 NO_ZERO_DATE请参阅 第 5.1.10 节,“服务器 SQL 模式”

    刚刚描述的非标准行为已被弃用;希望在未来的 MySQL 版本中删除它们。

    如果 explicit_defaults_for_timestamp 启用,服务器将禁用非标准行为并按TIMESTAMP如下方式处理列:

    • 无法为TIMESTAMP分配 值 NULL以将其设置为当前时间戳。要分配当前时间戳,请将列设置为CURRENT_TIMESTAMP或 同义词,例如NOW()

    • TIMESTAMP未使用NOT NULL 属性显式声明的列会自动使用 NULL属性和许可 NULL值进行声明。为这样的列分配一个值NULL将其设置为 NULL,而不是当前时间戳。

    • TIMESTAMPNOT NULL属性声明的列不允许NULL值。对于NULL为此类列指定的插入,结果要么是启用严格 SQL 模式的单行插入错误,要么'0000-00-00 00:00:00'是禁用严格 SQL 模式的多行插入错误。在任何情况下都不会为列分配一个值,NULL将其设置为当前时间戳。

    • TIMESTAMP使用NOT NULL 属性显式声明而没有显式 DEFAULT属性的列被视为没有默认值。对于没有为此类列指定显式值的插入行,结果取决于 SQL 模式。如果启用了严格 SQL 模式,则会发生错误。如果未启用严格 SQL 模式,则使用隐式默认值声明该列'0000-00-00 00:00:00'并出现警告。这类似于 MySQL 处理其他时间类型的方式,例如 DATETIME.

    • 没有TIMESTAMP使用DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP属性自动声明列必须明确指定这些属性。

    • TIMESTAMP表中 第一列的处理方式TIMESTAMP与第一列之后的列没有区别 

    如果 explicit_defaults_for_timestamp 在服务器启动时禁用,错误日志中会出现此警告:

    [Warning] TIMESTAMP with implicit DEFAULT value is deprecated.
    Please use --explicit_defaults_for_timestamp server option (see
    documentation for more details).

    如警告所示,要禁用已弃用的非标准行为,请explicit_defaults_for_timestamp 在服务器启动时启用 系统变量。

     

    解读:

    explicit_defaults_for_timestamp 参数默认值为OFF,

    当这个参数值为OFF时,建表语句中的timestamp类型字段会按照如下规则处理,

    1、如果timestamp未使用null属性显式的声明字段类型,则会自动使用not null属性进行声明。

    2、表中第一个timestamp字段列,如果没有使用 null 、default 或 on update 显式声明,则会自动使用 DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP 进行声明。

    3、表中第一个tiemstamp字段之后的列,如果没有使用 null 、default 或 on update 显式声明,则会自动使用 default '0000-00-00 00:00:00' 进行声明。

    注意:根据sql_mode参数是否启用了 NO_ZERO_DATE ,或者使用了严格模式 TRADITIONAL,默认值 '0000-00-00 00:00:00'  可能无效。

     

    例1(explicit_defaults_for_timestamp=OFF ,建表语句不显式指定null 、default 、 on update):

    建表语句中,sj 字段并没有显式的设置是否为Null,一般情况下,创建不指定not null的情况时,都是允许为null,

    但在MySQL中受 explicit_defaults_for_timestamp 参数影响,建表语句已经发生了变化。

    所有的timestamp列都是not null defaul xxxx ,第一个timestamp列还自动加上了on update CURRENT_TIMESTAMP

    mysql> show global variables like '%explicit_defaults_for_timestamp%';
    +---------------------------------+-------+
    | Variable_name | Value |
    +---------------------------------+-------+
    | explicit_defaults_for_timestamp | OFF |
    +---------------------------------+-------+
    1 row in set (0.00 sec)



    mysql> drop table tt; Query OK, 0 rows affected (0.00 sec) mysql> create table tt(id int primary key,sj timestamp,sj1 timestamp ,sj2 timestamp); Query OK, 0 rows affected (0.01 sec) mysql> show create table ttG *************************** 1. row *************************** Table: tt Create Table: CREATE TABLE `tt` ( `id` int(11) NOT NULL, `sj` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, `sj1` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', `sj2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 1 row in set (0.00 sec)

     

    例2(explicit_defaults_for_timestamp=OFF ,建表语句显式指定null 、default 、 on update):

    第一个timestamp列显式指定了null 属性,没有受到参数影响。

    第二个timestamp列显式指定了default属性,没有受到参数影响。

    第三个timestamp列,只显式指定了on update CURRENT_TIMESTAMP,并没有显式指定null 或 default值,会受参数影响,自动加上not null default xxx

    mysql> show global variables like '%explicit_defaults_for_timestamp%';
    +---------------------------------+-------+
    | Variable_name                   | Value |
    +---------------------------------+-------+
    | explicit_defaults_for_timestamp | OFF   |
    +---------------------------------+-------+
    1 row in set (0.00 sec)
    
    mysql> drop table tt;
    Query OK, 0 rows affected (0.00 sec)
    
    mysql> create table tt(id int primary key,sj timestamp null ,sj1 timestamp default '2008-08-08 08:08:08',sj2 timestamp ON UPDATE CURRENT_TIMESTAMP);
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> show create table ttG
    *************************** 1. row ***************************
           Table: tt
    Create Table: CREATE TABLE `tt` (
      `id` int(11) NOT NULL,
      `sj` timestamp NULL DEFAULT NULL,
      `sj1` timestamp NOT NULL DEFAULT '2008-08-08 08:08:08',
      `sj2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    1 row in set (0.00 sec)

    例3(explicit_defaults_for_timestamp=ON):

    服务器将禁用非标准行为,timestamp列按如下方式处理

    无法为timestamp列null属性分配当前时间戳,要分配当前时间戳,请将列设置为current_timestamp或同义词,比如now()

    timestamp未使用not null显式定义列属性,会自动使用null属性和默认null值进行定义。

    timestamp使用not null进行定义,但如果插入null值时,受SQL_MODEC严格模式影响,要么会报错,要么会写入'0000-00-00 00:00:00'

    表中第一个timestamp列与之后的tiemstamp列处理方式没有区别。

     

    mysql> create table tt(id int primary key,sj timestamp,sj1 timestamp not null,sj2 timestamp ON UPDATE CURRENT_TIMESTAMP);
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> show create table ttG
    *************************** 1. row ***************************
           Table: tt
    Create Table: CREATE TABLE `tt` (
      `id` int(11) NOT NULL,
      `sj` timestamp NULL DEFAULT NULL,
      `sj1` timestamp NOT NULL,
      `sj2` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
      PRIMARY KEY (`id`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8
    1 row in set (0.00 sec)
    
    mysql> insert into tt select 1,null,null,null;
    Query OK, 1 row affected, 1 warning (0.00 sec)
    Records: 1  Duplicates: 0  Warnings: 1
    
    mysql> select * from ttG
    *************************** 1. row ***************************
     id: 1
     sj: NULL
    sj1: 0000-00-00 00:00:00
    sj2: NULL
    1 row in set (0.00 sec)
  • 相关阅读:
    eval解析的函数传参 object array
    whistle证书过期或不信任
    isa hasa的区别、及理解
    JVM工作原理和特点
    Cookie跨域操作
    关闭当前窗口js
    css遮罩层
    js 获得两个数组的重复元素
    主页变灰
    js 格式化日期
  • 原文地址:https://www.cnblogs.com/nanxiang/p/15205751.html
Copyright © 2011-2022 走看看