Mysql

关注公众号 jb51net

关闭
首页 > 数据库 > Mysql > mysql datetime和timestamp

MySQL中的DATETIME 和 TIMESTAMP典型用法及关键区别

作者:dj_master

在MySQL里,DATETIME和TIMESTAMP虽都用于存储日期时间数据,但在存储范围、时区处理、存储空间、默认行为等方面差异显著,下面通过本文给大家介绍MySQL中的DATETIME 和 TIMESTAMP典型用法及关键区别,感兴趣的朋友一起看看吧

在 MySQL 里,DATETIMETIMESTAMP 虽都用于存储日期时间数据,但在存储范围、时区处理、存储空间、默认行为等方面差异显著,详细对比分析如下:

一、存储范围

类型取值范围限制原因适用场景
DATETIME1000-01-01 00:00:00.0000009999-12-31 23:59:59.999999无特殊限制,覆盖极广时间范围需记录历史久远或未来远期时间(如古籍文献时间、项目长期规划时间 )
TIMESTAMP1970-01-01 00:00:01.000000 UTC 到 2038-01-19 03:14:07.999999 UTC基于 Unix 时间戳(32 位整数存秒数 ),受整数范围限制记录系统事件(如创建/修改时间 ),但需注意 2038 年“溢出”问题

二、时区处理

类型时区相关性存储与查询逻辑示例(当前时区 +08:00 ,插入 2025-06-20 14:18:00
DATETIME与时区无关,原样存储插入时存输入值,查询时直接返回,不受 MySQL 时区设置影响2025-06-20 14:18:00 ,查出来还是 2025-06-20 14:18:00
TIMESTAMP与时区相关,基于 UTC 转换插入时,MySQL 会将当前时区时间转为 UTC 存储;查询时,再转回当前会话时区显示插入时,+08:00 时间会转成 UTC 时间 2025-06-20 06:18:00 存储;查询时,再转回 +08:00 显示 2025-06-20 14:18:00

三、存储空间

类型基础存储大小(无小数秒)小数秒存储(如 .nnnnnn说明(MySQL 版本差异 )
DATETIME5 字节(MySQL 5.6.4+ )小数部分占 0 - 3 字节(取决于精度,如 .000001 占 3 字节 )5.6.4 前占 8 字节,之后优化为 5 字节 + 小数部分
TIMESTAMP4 字节小数部分占 0 - 3 字节始终基于 Unix 时间戳的存储优化,空间占用更小

四、默认值与自动更新行为

类型默认值规则自动更新支持示例(表设计 )
DATETIME默认不自动赋值,若未指定 DEFAULT ,插入后为 NULL需手动设置(如 DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMPsql<br>-- 需手动指定默认值才会自动填充<br>ALTER TABLE t ADD COLUMN dt DATETIME DEFAULT CURRENT_TIMESTAMP;<br>
TIMESTAMP未显式赋值时,默认填当前时间戳CURRENT_TIMESTAMP支持自动初始化(DEFAULT CURRENT_TIMESTAMP )和更新(ON UPDATE CURRENT_TIMESTAMPsql<br>-- 插入时自动填当前时间,更新行时自动更新时间<br>ALTER TABLE t ADD COLUMN ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;<br>

五、应用场景与典型用法

-- 记录文物出土时间,无论数据库时区如何,时间固定
CREATE TABLE relics (
    id INT PRIMARY KEY,
    unearthed_time DATETIME -- 存如 `1000-01-01 12:00:00`
);
-- 自动记录创建和修改时间,跨时区访问时自动转换
CREATE TABLE users (
    id INT PRIMARY KEY,
    create_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 插入时自动填当前时间
    update_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 更新时自动更新
);

六、关键区别总结(表格版)

特性DATETIMETIMESTAMP
存储范围极广(1000-01-019999-12-31有限(1970-01-01 UTC 到 2038-01-19 UTC )
时区处理与时区无关,原样存储与 UTC 关联,插入/查询时自动时区转换
存储空间5 字节(5.6.4+ ,无小数秒 )4 字节(无小数秒 )
默认值行为需手动设置默认值,否则为 NULL未赋值时默认填当前时间戳
自动更新需手动开启(ON UPDATE支持自动初始化和更新(常用作修改时间字段 )
典型场景固定时间点记录(如合同签订时间 )系统事件时间(如创建/修改时间 )、跨时区应用

实际使用时,若需处理跨时区业务或自动记录修改时间,选 TIMESTAMP;若需存远期时间、固定时间点且与时区无关,选 DATETIME。需注意 TIMESTAMP 的 2038 年限制,长期业务需提前规划替代方案(如迁移到 DATETIME 或用大数据时间类型 )。

到此这篇关于在 MySQL 里,DATETIME 和 TIMESTAMP的文章就介绍到这了,更多相关mysql datetime和timestamp内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文