Yihui’s Blog

MySQL 中 DATETIME 和 TIMESTAMP 类型的区别是什么?

日期:2026-07-11
难度:简单
标签:#面试 #MySQL #时间类型 #VIP

一句话答案

DATETIME 保存字面日期时间且范围更大、不随会话时区转换;TIMESTAMP 按 UTC 语义存储、读写时按会话时区转换,但传统范围主要受 2038 年限制。

原理拆解

对比项DATETIMETIMESTAMP
范围1000-01-01 到 9999-12-31约 1970-01-01 到 2038-01-19 UTC
时区不自动转换写入转 UTC、读取转会话时区
存储无小数秒时 5 字节无小数秒时 4 字节
自动初始化/更新新版本支持支持
适合预约时间、生日、历史日期创建/更新时间、跨时区时间点

面试口语版

如果表示一个绝对时间点并希望不同地区按各自时区显示,TIMESTAMP 更自然,因为它会基于会话 time_zone 做转换;但要注意 2038 范围。DATETIME 记录的是给定的年月日时分秒,不会因会话时区变化,更适合“当地时间就是业务事实”的预约或很远的未来日期。无论选哪种,跨服务系统都应明确时区契约,通常应用内部使用 UTC,边界层再转换。

关键细节

  • 两者都支持最多 6 位小数秒,存储大小会相应增加。
  • 不要把 TIMESTAMP 简化为“自动更新时间”,现代 DATETIME 也能配置默认值和自动更新。
  • 驱动、连接池和数据库会话时区不一致是常见线上问题。

面试官追问

  1. 为什么会有 2038 问题?
  2. 跨时区系统应该如何存时间?
  3. 生日适合哪个类型?

高分补充

时间字段设计还要区分“时间点”“本地日历时间”和“持续时长”,三者不是同一种业务语义。

学习清单

  • 记住范围、时区转换、存储和适用场景。
Maintained by · YihuiEdit on GitHub

Keep reading

View all posts