日期:2026-07-11
难度:简单
标签:#面试 #MySQL #时间类型 #VIP
一句话答案
DATETIME 保存字面日期时间且范围更大、不随会话时区转换;TIMESTAMP 按 UTC 语义存储、读写时按会话时区转换,但传统范围主要受 2038 年限制。
原理拆解
| 对比项 | DATETIME | TIMESTAMP |
|---|---|---|
| 范围 | 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 也能配置默认值和自动更新。
- 驱动、连接池和数据库会话时区不一致是常见线上问题。
面试官追问
- 为什么会有 2038 问题?
- 跨时区系统应该如何存时间?
- 生日适合哪个类型?
高分补充
时间字段设计还要区分“时间点”“本地日历时间”和“持续时长”,三者不是同一种业务语义。
学习清单
- 记住范围、时区转换、存储和适用场景。