核心区别
| 特性 | datetime | timestamp |
|---|---|---|
| 存储空间 | 8 字节 | 4 字节 |
| 时间范围 | 1000-01-01 ~ 9999-12-31 | 1970-01-01 ~ 2038-01-19 |
| 时区处理 | 存储原始值,不转换 | 存储为 utc,读取时按会话时区转换 |
| 默认值 | 可设固定值 | 支持 current_timestamp 自动更新 |
| 自动更新 | 需手动/触发器 | 支持 on update current_timestamp |
选择建议
✅ 选择 datetime 当:
- 需要存储历史日期(如出生日期、历史事件)
- 时间范围可能超出 2038 年
- 需要固定不变的时间记录(如订单创建时间,不因时区改变)
- 应用层已统一处理时区,不需要数据库介入
create table events (
event_time datetime not null default '2024-01-01 00:00:00',
birthday datetime not null -- 出生日期,固定不变
);✅ 选择 timestamp 当:
- 需要自动记录创建/更新时间
- 应用面向全球用户,需要时区自适应
- 存储空间敏感(节省 50%)
- 时间范围在 1970-2038 之间
create table users (
created_at timestamp default current_timestamp,
updated_at timestamp default current_timestamp on update current_timestamp
);关键注意事项
1. timestamp 的 2038 年问题
2038-01-19 后 32 位 timestamp 会溢出。mysql 8.0+ 已支持 64 位,但旧系统需警惕。
2. 时区陷阱
-- 会话时区改变,timestamp 显示值会变 set time_zone = '+8:00'; select ts from table; -- 显示北京时间 set time_zone = '+0:00'; select ts from table; -- 显示 utc 时间(数值变了!)
datetime 不受此影响,始终显示存储时的原始值。
3. 混合使用策略(推荐)
create table orders (
-- 面向用户的本地时间,固定不变
order_time datetime not null,
-- 内部审计/日志,带时区信息
created_at timestamp default current_timestamp,
updated_at timestamp default current_timestamp on update current_timestamp
);总结
| 场景 | 推荐类型 |
|---|---|
| 出生日期、历史日期、未来远期日期 | datetime |
| 记录创建/修改时间、全球化应用 | timestamp |
| 两者都需要 | 混合使用 |
一句话原则:需要"人类看到的固定时间"用 datetime;需要"系统记录的瞬时时刻"用 timestamp。
到此这篇关于mysql如何选择datetime与timestamp存储时间的文章就介绍到这了,更多相关mysql选择datetime与timestamp存储时间内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论