技术科普

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,能避免大部分混乱。