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 报Row size too large 65535 的原因及解决方法

    Mysql 报Row size too large 65535 的原因及解决方法

    这篇文章主要介绍了Mysql 报Row size too large 65535 的原因及解决方法 的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-06-06
  • MySQL索引中的页及索引的分类及使用

    MySQL索引中的页及索引的分类及使用

    文章介绍了InnoDB存储引擎的页结构(16KB逻辑单位,含页头、页尾、用户记录等)及索引分类,包括普通索引(MUL)、唯一索引(UNI)、主键索引(PRI)等,强调主键索引作为聚簇索引的特性,以及索引覆盖优化查询效率的原理,感兴趣的朋友跟随小编一起看看吧
    2025-07-07
  • windows 10 下安装mysql 5.7.17的简单笔记

    windows 10 下安装mysql 5.7.17的简单笔记

    之前一直在Linux下用MySQL,安装也很简单,今天试一下windows下安装,发现有很多坑,今天小编通过本教程给大家记录下,一起看看吧
    2016-12-12
  • MySQL数据库的触发器和事务

    MySQL数据库的触发器和事务

    这篇文章主要介绍了MySQL数据库的触发器和事务,触发器是SQL server提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊的存储过程,是由事件来触发
    2022-08-08
  • 简单讲解sql语句中的group by的使用方法

    简单讲解sql语句中的group by的使用方法

    掌握sql语句中group by的使用方法会对我们的工作效率有很大的提升,下面小编来和大家一起简单学习一下
    2019-05-05
  • Mysql连接无效(invalid connection)问题及解决

    Mysql连接无效(invalid connection)问题及解决

    这篇文章主要介绍了Mysql连接无效(invalid connection)问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • mysql中截取字符串的6个函数讲解

    mysql中截取字符串的6个函数讲解

    这篇文章主要介绍了mysql中截取字符串的6个函数讲解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-08-08
  • mysql定时自动备份数据库的方法步骤

    mysql定时自动备份数据库的方法步骤

    我们都知道数据是无价,如果不对数据进行备份,相当是让数据在裸跑,本文就介绍一下如何给mysql定时自动备份数据,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • MySQL 5.7常见数据类型

    MySQL 5.7常见数据类型

    这篇文章主要介绍了MySQL 5.7数据类型详解,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-07-07
  • 深入解析MySQL中的Redo Log、Undo Log和Binlog

    深入解析MySQL中的Redo Log、Undo Log和Binlog

    本文详细介绍了MySQL中的RedoLog、UndoLog和Binlog的背景、业务场景、功能、底层实现原理以及使用措施,通过Java代码示例展示了如何与这些日志进行交互,进一步深化了对MySQL日志系统的理解,理解并合理使用这些日志,可以有效地提升数据库的性能和可靠性
    2024-10-10

最新评论