MariaDB中CURRENT_TIMESTAMP与DATETIME字段的时区处理疑问
MariaDB 时区转换逻辑:DATETIME vs TIMESTAMP
你的问题核心在于混淆了DATETIME和TIMESTAMP类型的时区处理逻辑,以下是明确的解释和解决方案:
原因分析
DATETIME类型:存储的是无时区的字面时间值,仅保存年-月-日 时:分:秒的字符串形式,不关联任何时区信息。插入时直接记录当前会话时区下的时间字面量;读取时也直接返回存储的字面量,不会随后续时区变更而转换。这就是第二次查询中created字段值不变的原因。CURRENT_TIMESTAMP函数:实时返回当前会话时区对应的当前时间,每次调用都会根据当前TIME_ZONE配置计算,所以修改时区后返回值会随之变化。
解决方案:改用TIMESTAMP类型
如果需要时间值能随会话时区自动转换,将字段类型改为TIMESTAMP即可。TIMESTAMP会以UTC时间存储,插入时自动将当前会话时区的时间转换为UTC保存,读取时再转换为当前会话时区的时间。
修改后的测试代码:
CREATE TABLE aoeui ( id int NOT NULL AUTO_INCREMENT PRIMARY KEY, created TIMESTAMP DEFAULT CURRENT_TIMESTAMP -- 改为TIMESTAMP类型 ); INSERT INTO aoeui () VALUES (); SELECT *, CURRENT_TIMESTAMP as ts FROM aoeui; SET TIME_ZONE = '+08:00'; SELECT *, CURRENT_TIMESTAMP as ts FROM aoeui; DROP TABLE aoeui; SET TIME_ZONE = 'SYSTEM';
执行后第二次查询结果会变成:
+----+---------------------+---------------------+ | id | created | ts | +----+---------------------+---------------------+ | 1 | 2023-08-15 14:26:47 | 2023-08-15 14:26:47 | +----+---------------------+---------------------+
此时created和ts都会随时区转换为+08:00对应的时间。
关键区别总结
| 类型 | 存储方式 | 时区转换逻辑 |
|---|---|---|
| DATETIME | 字面时间字符串(无时区) | 插入/读取均不做时区转换 |
| TIMESTAMP | UTC时间戳 | 插入转UTC,读取转当前会话时区 |
内容的提问来源于stack exchange,提问作者Ulrich Eckhardt
相关产品推荐
相关产品推荐

