目录
- 1. 弊端
- 1.1. 取值范围
- 1.2. 时区依赖
- 1.3. 隐式转换
- 2. 区别
- 3. 解决
1. 弊端
1.1. 取值范围
TIMESTAMP
的取值范围为 1970-01-01 00:00:01 UTC
到 2038-01-19 03:14:07 UTC
,超出范围的数据会被强制归零或触发异常。
具体表现为在基金债券等业务中,到期日可能是一个比较晚的未来的时间,很可能就会出现超出 TIMESTAMP
范围的时间。
现在已经 2025 年了,系统崩溃只在眨眼之间!!!
1.2. 时区依赖
存入时自动转换为 UTC 时间
,查询时根据会话时区转换回本地时间。若时区配置不一致,同一时间在不同服务器显示结果不同
1.3. 隐式转换
存入 NULL
会自动填充为当前时间
2. 区别
特性 | TIMESTAMP | DATETIME |
---|---|---|
存储机制 | 整数(Unix 时间戳) | 字符串(YYYY-MM-DD HH:MM:SS ) |
存储空间 | 4 字节(旧版)或 7 字节(MySQL 5.6+) | 8 字节 |
时区处理 | 自动转换为 UTC 存储并转换回会话时区 | 无视时区,直接存储原始值 |
取值范围 | 1970-01-01 00:00:01 ~ 2038-01-19 03:14:07 | 1000-01-01 00:00:00 ~ 9999-12-31 23:59:59 |
默认值支持 | 支持 CURRENT_TIMESTAMP 自动初始化 | 需显式声明 |
2038 年问题 | ❗ 2038 年后溢出 | ✅ 无此限制 |
NULL 处理 | 自动填充为当前时间 | 保持 NULL |
3. 解决
2038 年后必须迁移至 DATETIME
;跨国系统优先 DATETIME
减少时区风险。