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

 更新时间:2026年04月24日 09:36:55   作者:冰川箭仙  
本文主要介绍了MySQL如何选择Datetime与Timestamp存储时间,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

核心区别

特性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存储时间内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 在MySQL现有表中添加自增ID的方法步骤

    在MySQL现有表中添加自增ID的方法步骤

    当在MySQL数据库中,自增ID是一种常见的主键类型,它为表中的每一行分配唯一的标识符,在某些情况下,我们可能需要在现有的MySQL表中添加自增ID,以便更好地管理和索引数据,在本文中,我们将讨论如何在MySQL现有表中添加自增ID,并介绍相关的步骤和案例
    2023-09-09
  • MySQL学习之分组查询的用法详解

    MySQL学习之分组查询的用法详解

    这篇文章主要为大家详细介绍一下MySQL中分组查询的使用,文中的示例代码讲解详细,对我们学习MySQL有一定帮助,需要的可以参考一下
    2022-07-07
  • MySQL与SQL的触发器的不同写法

    MySQL与SQL的触发器的不同写法

    当在SQL、MySQL数据库中一张表中插入一条记录时,触动触发器,使同一数据库的另一张表插入相同记录。
    2010-09-09
  • MySQL数据库中的UPDATE(更新数据)详解

    MySQL数据库中的UPDATE(更新数据)详解

    这篇文章主要详细介绍了MySQL的UPDATE语句,包括其基本语法、高级用法、性能优化策略以及注意事项,通过示例和实战,帮助读者更好地理解和应用这一重要的SQL命令,需要的朋友可以参考下
    2024-12-12
  • 阿里云配置MySQL-server 8.0远程登录的实现

    阿里云配置MySQL-server 8.0远程登录的实现

    我们经常会碰到需要远程访问数据库的场景,本文主要介绍了阿里云配置MySQL-server 8.0远程登录的实现,具有一定的参考价值,感兴趣的可以了解一下
    2023-08-08
  • 一条sql语句完成MySQL去重留一

    一条sql语句完成MySQL去重留一

    在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供 有distinct这个关键字来过滤掉多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。
    2017-12-12
  • MySQL字符编码设置方法

    MySQL字符编码设置方法

    这篇文章主要介绍了MySQL字符编码设置方法的相关资料,需要的朋友可以参考下
    2016-05-05
  • Mysql索引的类型和优缺点详解

    Mysql索引的类型和优缺点详解

    这篇文章主要为大家详细介绍了Mysql索引的类型和优缺点,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-09-09
  • 浅谈MySQL8和MySQL5.7在自增计数上的区别

    浅谈MySQL8和MySQL5.7在自增计数上的区别

    MySQL数据库是一款非常流行的开源数据库,其版本升级迅速,在使用过程中也发现了不同版本之间存在着一些区别,本文主要介绍了MySQL8和MySQL5.7在自增计数上的区别,感兴趣的可以了解一下
    2023-10-10
  • MySQL与Oracle对比及区别说明

    MySQL与Oracle对比及区别说明

    这篇文章主要介绍了MySQL与Oracle对比及区别说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05

最新评论