mysql 配置 explicit_defaults_for_timestamp

本文详细解析MySQL中TIMESTAMP类型的特性,包括current_timestamp与onupdatecurrent_timestamp的功能及使用场景,并阐述了my.ini配置文件中explicit_defaults_for_timestamp参数的作用及其对TIMESTAMP列的影响。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在之前的配置中,除了目录之外,唯独添加了这一项配置,为什么?

因为mysql中timestamp类型和其他的类型不一样;

 

在之前先了解一下current timestamp和on update current timestamp:

a. current timestamp :当insert时,如果timestamp列属性设为current_timestamp,那么该列会被强制写入当前的系统时间(无论你是不是设置了默认值);

b. on update current timestamp:当update时,如果字段属性设为on update current_timestamp,那么该列会被强制写入当前系统时间(无论是否要更新该列);


官方解释如下:

1. 在默认情况下(explicit_defaults_for_timestamp=1),如果timestamp数据列没有明确设置null属性,那么该列会被自动添加not null属性,如果写入数据时设置null,那么mysql会自动把当前时间戳写入该列,作为默认值 ...

注:其他类型的列,在没有明确设置not null的情况下,默认是允许null值;

2. 表中如果有多个timestamp列,那么第一列如果没有指定null或者设置默认值,也没有指定on update语句,那么该列会被自动添加default current_timestamp和on update current_timestamp属性;

3.同第2条,除了第一列之外,其他的timestamp列如果没有指定null属性,也没有指定默认值,那么该列会被自动添加default '0000-00-00 00:00:00'属性;如果insert语句没有为该列添加指定值,那么该列会被插入'0000-00-00 00:00:00',而且不会提示警告;

 

所以我们在my.ini配置文件中,添加了该项配置,否则启动时,会提示以下报警:

[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=1)之后有什么效果呢?

1. 如果timestamp列没有显示指定not null属性,那么默认允许null,当插入数据时,不会被写入currrent timestamp;

2. mysql不会自动给第一个timestamp列添加default current_timestamp和on update current_timestamp属性(除非你在建表时显示指明);

3. 如果timestamp列指明是not null属性,而且没有指定默认值,这时候写入数据时如果不给该列写入数据,那么有以下两种情况:

  a. 指定strict sql_mode的情况下,会直接报错;

  b. 未指定strict sql_mode的情况下,会默认插入'0000-00-00 00:00:00',并发生一个报警;

转载于:https://www.cnblogs.com/wangdy/p/6972330.html

### MySQL `explicit_defaults_for_timestamp` 参数的作用 `explicit_defaults_for_timestamp` 是一个 MySQL 全局变量,用于控制服务器对 `TIMESTAMP` 列的行为方式。具体来说,它决定了 `TIMESTAMP` 列的默认值以及是否允许存储特殊值 `'0000-00-00 00:00:00'` 或者 `NULL` 值。 #### 当 `explicit_defaults_for_timestamp=OFF` 在这种情况下,MySQL 使用一种向后兼容的方式处理 `TIMESTAMP` 列: - 如果未显式定义 `DEFAULT` 和 `NULL` 属性,则 `TIMESTAMP` 列会被设置为 `NOT NULL DEFAULT '0000-00-00 00:00:00'`[^5]。 - 此外,在某些 SQL 模式下(如包含 `NO_ZERO_DATE`),这种行为可能会受到限制,从而阻止将非法日期作为默认值[^4]。 #### 当 `explicit_defaults_for_timestamp=ON` 启用此选项时,MySQL 不再使用上述隐式的默认行为,而是完全依赖用户的声明来定义 `TIMESTAMP` 列的特性: - 用户必须明确指定每一列是否支持 `NULL` 值及其默认值。 - Airflow 等工具通常需要这样的配置才能正常工作,因为它期望 `TIMESTAMP` 列具有更严格的语义,即默认值应为 `NULL` 而不是 `'0000-00-00 00:00:00'`[^2]。 --- ### 设置方法 可以通过修改 MySQL 配置文件或者通过命令行动态调整该参数的值。 #### 方法一:编辑 my.cnf 文件 找到并编辑 MySQL配置文件 (`my.cnf`) ,在 `[mysqld]` 下添加或更改如下内容: ```ini [mysqld] explicit_defaults_for_timestamp=ON ``` 保存文件后重启 MySQL 服务使改动生效。 #### 方法二:运行 SET GLOBAL 命令 也可以直接执行 SQL 查询以临时改变这一设定(仅限当前会话有效): ```sql SET GLOBAL explicit_defaults_for_timestamp = ON; ``` 注意这种方式不会持久化到下次启动之后;如果希望永久应用新设值,请采用第一种办法[^3]。 --- ### 示例代码展示 假设我们创建一张表 test_table 来观察不同状态下 timestamp 行为差异: ```sql CREATE TABLE test_table ( id INT PRIMARY KEY, created_at TIMESTAMP -- No attributes specified here. ); ``` 当 `explicit_defaults_for_timestamp=OFF` 时,created_at 将自动获得 NOT NULL 并且其初始值将是 ‘0000-00-00 00:00:00’ (除非受 sql_mode 影响)[^1]。 而一旦切换至 ON 状态,尝试插入记录而不提供 created_at 数据将会引发错误,直到开发者自行赋予合适的属性为止。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值