Mysql CURRENT_TIMESTAMP

在 MySQL 中,CURRENT_TIMESTAMP 是一个用于获取或设置当前日期和时间的函数/关键字,广泛应用于时间戳字段的默认值或自动更新场景。

核心功能

  • DEFAULT CURRENT_TIMESTAMP:插入新行时自动设置当前时间(若未显式指定值)
  • ON UPDATE CURRENT_TIMESTAMP:更新行时自动刷新为当前时间(需其他列值变化触发)

获取当前时间‌

CURRENT_TIMESTAMP 等价于 NOW(),返回当前日期和时间(格式为 YYYY-MM-DD HH:MM:SS)‌‌。

设置默认值

可用于 TIMESTAMP 或 DATETIME(MySQL 5.6.5+ 支持)字段的 DEFAULT 值‌‌。

自动更新

配合 ON UPDATE CURRENT_TIMESTAMP,可在记录更新时自动将字段值设为当前时间‌‌。

时间精度(微秒支持)

精确到微秒(最高6位)

CREATE TABLE t (                                                                                                                                                                              
    created_at DATETIME(6) DEFAULT CURRENT_TIMESTAMP(6),
    updated_at DATETIME(6) ON UPDATE CURRENT_TIMESTAMP(6)                                                                                                                                     
);                                                              

SELECT CURRENT_TIMESTAMP(3); -- 精确到毫秒,如:2024-01-01 12:00:00.123

与 NOW()、SYSDATE() 的区别

  • CURRENT_TIMESTAMP / NOW() 返回语句开始执行时的时间,同一事务内多次调用结果相同
  • SYSDATE() 返回函数实际执行时的时间,同一语句中多次调用可能不同

代码如下:

-- NOW() 和 CURRENT_TIMESTAMP 在同一事务内一致                                                                                                                                                
START TRANSACTION;                                              
SELECT NOW();  -- 2024-01-01 10:00:00
DO SLEEP(2);
SELECT NOW();  -- 仍是 2024-01-01 10:00:00(不变)
COMMIT;

-- SYSDATE() 实时变化
SELECT SYSDATE(); -- 10:00:00
DO SLEEP(2);
SELECT SYSDATE(); -- 10:00:02(变了)

时区影响

如果服务器时区与应用时区不一致,TIMESTAMP 列的值会出现偏差,推荐明确设置 time_zone。

-- 查看当前时区设置
SHOW VARIABLES LIKE 'time_zone';

-- TIMESTAMP 类型:存储UTC,读取时转换为会话时区(受时区影响)
-- DATETIME 类型:存储字面值,不做时区转换(不受时区影响)

-- 设置会话时区
SET time_zone = '+08:00';
SELECT CURRENT_TIMESTAMP; -- 显示东八区时间

TIMESTAMP 类型的范围限制

  • TIMESTAMP:范围是 1970-01-01 00:00:01 UTC ~ 2038-01-19 03:14:07 UTC(2038年问题)
  • DATETIME:范围是 1000-01-01 ~ 9999-12-31,无2038问题

推荐:新项目使用 DATETIME + DEFAULT CURRENT_TIMESTAMP,避免2038年问题。

NULL 值处理行为

TIMESTAMP 在 strict mode 关闭时,NOT NULL 列插入 NULL 会自动填充当前时间(旧版行为),MySQL 5.7+ strict mode 默认开启,此行为已改变。

-- 明确允许 NULL 的写法
CREATE TABLE t (
    created_at TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
);

DEFAULT CURRENT_TIMESTAMP 与 DEFAULT NULL 的选择建议

  • 必须记录创建时间  NOT NULL DEFAULT CURRENT_TIMESTAMP  
  • 允许"未知时间" NULL DEFAULT NULL
  • 需要区分"未操作"和"已操作" NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP       

典型应用场景

‌1. 创建时间字段(仅插入时设置)

CREATE TABLE example (
    id INT AUTO_INCREMENT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

2. 更新时间字段(插入和更新均自动设置)

CREATE TABLE example (
    id INT AUTO_INCREMENT PRIMARY KEY,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

这两个操作是mysql数据库本身在维护,所以可以根据这个特性来生成【创建时间】和【更新时间】两个字段,且不需要代码来维护。

3. 查询当前时间

SELECT CURRENT_TIMESTAMP, NOW();
posted @ 2026-05-07 15:28  李小菜丶  阅读(84)  评论(0)    收藏  举报