当前位置: 代码网 > it编程>数据库>Mysql > MySQL如何选择Datetime与Timestamp存储时间

MySQL如何选择Datetime与Timestamp存储时间

2026年04月24日 Mysql 我要评论
核心区别特性datetimetimestamp存储空间8 字节4 字节时间范围1000-01-01~9999-12-311970-01-01~2038-01-19时区处理存储原始值,不转换存储为 ut

核心区别

特性datetimetimestamp
存储空间8 字节4 字节
时间范围1000-01-01 ~ 9999-12-311970-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存储时间内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com