技术科普
MySQL 时区设置:TIMESTAMP 与 DATETIME
MySQL 中时间类型的选择直接影响时区行为。最常见的困惑是 TIMESTAMP 与 DATETIME 的区别。
两种类型
TIMESTAMP:存储时转换为 UTC,读取时按会话时区转换,范围有限(1970–2038)DATETIME:按字面值存储,不进行时区转换,范围更大
因此,TIMESTAMP 适合记录“瞬间”,DATETIME 适合记录“墙上时间”或未来日期。
时区配置
查看会话时区:SELECT @@session.time_zone;。设置会话时区:SET time_zone = '+08:00';。全局时区可在配置文件中设置 default-time-zone。
CONVERT_TZ
CONVERT_TZ(dt, 'UTC', 'Asia/Shanghai') 可转换时区,但需要先导入时区表(mysql_tzinfo_to_sql),否则命名时区可能返回 NULL。
最佳实践
- 应用层统一使用 UTC 存储
- 连接时明确设置会话时区
- 避免依赖服务器默认时区
- 对跨时区查询显式转换
- 注意 TIMESTAMP 的 2038 年上限
MySQL 时区问题的根源是“隐式转换”。显式设置时区、统一存储 UTC,能避免大部分混乱。