MySQL中的DATETIME 和 TIMESTAMP典型用法及关键区别
作者:dj_master
在MySQL里,DATETIME和TIMESTAMP虽都用于存储日期时间数据,但在存储范围、时区处理、存储空间、默认行为等方面差异显著,下面通过本文给大家介绍MySQL中的DATETIME 和 TIMESTAMP典型用法及关键区别,感兴趣的朋友一起看看吧
在 MySQL 里,DATETIME
和 TIMESTAMP
虽都用于存储日期时间数据,但在存储范围、时区处理、存储空间、默认行为等方面差异显著,详细对比分析如下:
一、存储范围
类型 | 取值范围 | 限制原因 | 适用场景 |
---|---|---|---|
DATETIME | 1000-01-01 00:00:00.000000 到 9999-12-31 23:59:59.999999 | 无特殊限制,覆盖极广时间范围 | 需记录历史久远或未来远期时间(如古籍文献时间、项目长期规划时间 ) |
TIMESTAMP | 1970-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 版本差异 ) |
---|---|---|---|
DATETIME | 5 字节(MySQL 5.6.4+ ) | 小数部分占 0 - 3 字节(取决于精度,如 .000001 占 3 字节 ) | 5.6.4 前占 8 字节,之后优化为 5 字节 + 小数部分 |
TIMESTAMP | 4 字节 | 小数部分占 0 - 3 字节 | 始终基于 Unix 时间戳的存储优化,空间占用更小 |
四、默认值与自动更新行为
类型 | 默认值规则 | 自动更新支持 | 示例(表设计 ) |
---|---|---|---|
DATETIME | 默认不自动赋值,若未指定 DEFAULT ,插入后为 NULL | 需手动设置(如 DEFAULT CURRENT_TIMESTAMP 或 ON UPDATE CURRENT_TIMESTAMP ) | sql<br>-- 需手动指定默认值才会自动填充<br>ALTER TABLE t ADD COLUMN dt DATETIME DEFAULT CURRENT_TIMESTAMP;<br> |
TIMESTAMP | 未显式赋值时,默认填当前时间戳(CURRENT_TIMESTAMP ) | 支持自动初始化(DEFAULT CURRENT_TIMESTAMP )和更新(ON UPDATE CURRENT_TIMESTAMP ) | sql<br>-- 插入时自动填当前时间,更新行时自动更新时间<br>ALTER TABLE t ADD COLUMN ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;<br> |
五、应用场景与典型用法
DATETIME
适用场景- 需记录与时区无关的精确时间(如事件发生的固定时间点,不管服务器时区如何,时间都不变 )。
- 需存储历史久远或未来远期时间(如考古数据的时间记录、项目截止到 9999 年的任务 )。
- 示例:
-- 记录文物出土时间,无论数据库时区如何,时间固定 CREATE TABLE relics ( id INT PRIMARY KEY, unearthed_time DATETIME -- 存如 `1000-01-01 12:00:00` );
TIMESTAMP
适用场景- 需跨时区自动转换的场景(如全球化应用,不同时区用户看到的时间自动适配本地时区 )。
- 需自动记录创建/修改时间(如
create_time
自动填当前时间,update_time
更新时自动修改 )。
- 示例:
-- 自动记录创建和修改时间,跨时区访问时自动转换 CREATE TABLE users ( id INT PRIMARY KEY, create_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP, -- 插入时自动填当前时间 update_ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP -- 更新时自动更新 );
六、关键区别总结(表格版)
特性 | DATETIME | TIMESTAMP |
---|---|---|
存储范围 | 极广(1000-01-01 到 9999-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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
您可能感兴趣的文章:
- MySQL日期ATE、TIME、DATETIME、TIMESTAMP和YEAR的使用语句
- MySQL数据时区问题以及datetime和timestamp类型存储的差异
- MySQL之DATETIME与TIMESTAMP的时间精度问题
- MySQL 时间类型用 datetime, timestamp 还是 integer 更好
- 浅谈Mysql时间的存储 datetime还是时间戳timestamp
- 详解MySQL中timestamp和datetime时区问题导致做DTS遇到的坑
- MySQL 中 datetime 和 timestamp 的区别与选择
- MySQL中datetime和timestamp的区别及使用详解
- Mysql中的Datetime和Timestamp比较