外观
MySQL 中 DATETIME 和 TIMESTAMP 类型的区别是什么
在 MySQL 中,DATETIME
和 TIMESTAMP
都是用于存储日期和时间的数据类型,但它们在存储方式、范围、时区处理以及默认行为等方面存在显著区别。以下是它们的详细对比:
存储方式
DATETIME
:
- 存储格式:
YYYY-MM-DD HH:MM:SS
。 - 存储范围:
1000-01-01 00:00:00
到9999-12-31 23:59:59
。 - 占用空间:8 字节。
- 不与时区相关,存储的是绝对的日期和时间。
TIMESTAMP
:
- 存储格式:
YYYY-MM-DD HH:MM:SS
。 - 存储范围:
1970-01-01 00:00:01
到2038-01-19 03:14:07
(受限于 Unix 时间戳的范围)。 - 占用空间:4 字节。
- 与时区相关,存储的是 UTC 时间戳(Unix 时间戳)。
时区处理
DATETIME
:
- 不考虑时区,存储的是“原样”日期和时间。
- 无论服务器或客户端的时区设置如何,
DATETIME
的值都不会改变。
TIMESTAMP
:
- 存储的是 UTC 时间戳,但显示时会根据客户端的时区设置自动转换。
- 当插入或更新
TIMESTAMP
值时,MySQL 会将其转换为 UTC 存储;查询时会根据客户端的时区设置将其转换回本地时间。
默认行为
DATETIME
:
- 默认值可以是任何有效的日期时间字符串,例如
DEFAULT '2025-01-01 00:00:00'
。 - 如果没有指定默认值,
DATETIME
字段可以为NULL
或者需要手动指定默认值。
TIMESTAMP
:
- 默认值为当前时间戳(
CURRENT_TIMESTAMP
),并且可以自动更新为当前时间戳。 - 如果表中只有一个
TIMESTAMP
列,MySQL 会自动将其设置为DEFAULT CURRENT_TIMESTAMP
并且在更新记录时自动更新为当前时间戳。
性能和存储
DATETIME
:
- 占用空间较大(8 字节),但存储范围更广。
- 适合存储具体的日期和时间,例如事件时间、日志时间等。
TIMESTAMP
:
- 占用空间较小(4 字节),适合存储需要自动更新的时间戳,例如记录的创建时间和更新时间。
- 由于与时区相关,更适合需要跨时区处理的场景。
使用场景
DATETIME
:适用于存储具体的日期和时间,且不需要考虑时区转换的场景,例如:
- 事件的开始和结束时间。
- 日志记录的时间戳。
- 用户输入的日期和时间。
TIMESTAMP
:适用于需要自动记录创建时间和更新时间的场景,例如:
- 记录的创建时间(
created_at
)。 - 记录的最后更新时间(
updated_at
)。 - 需要跨时区处理的场景,例如全球用户系统。