MySQL DATETIME 和 TIMESTAMP 数据类型有什么区别?
mysqlmysqli database
这两种数据类型都以"YYYY-MM-DD HH:MM:SS"格式存储数据,并包含日期和时间。尽管有这些相似之处,但它们仍具有以下差异 −
- 范围 − Datetime 数据类型支持 1000-01-01 00:00:00 和 9999-12-31 23:59:59 之间的日期和时间。但 timestamp 数据类型支持"1970-01-01 00:00:01"之间的日期和时间。到‘2038-01-19 08:44:07’。
- 大小 − Datetime 需要 5 个字节以及 3 个额外字节用于存储秒的小数部分数据。另一方面,时间戳数据类型需要 4 个字节以及 3 个额外字节用于存储秒的小数部分数据。但在 MySQL 5.6.4 之前,DateTime 需要 8 个字节以及 3 个额外字节用于存储秒的小数部分数据。
- 从一个时区到另一个时区的转换 − 实际上在 MySQL5+ 中,时间戳值从当前时间转换为 UTC 反之亦然,而日期时间不进行任何转换。
- 索引 −可以对时间戳数据进行索引,但不能对日期时间数据进行索引。
- 查询缓存 − 具有时间戳数据类型的查询可以缓存,但具有日期时间数据类型的查询不能缓存。
以上是 DATETIME 和 TIMESTAMP 数据类型之间的一些主要区别,以下示例将对此进行演示 −
示例
mysql> Create table test_datetime(time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); Query OK, 0 rows affected (0.44 sec) mysql> INSERT INTO test_datetime (time) values (CURRENT_TIMESTAMP); Query OK, 1 row affected (0.04 sec) mysql> Select * from test_datetime; +---------------------+ | time | +---------------------+ | 2017-11-14 17:29:03 | +---------------------+ 1 row in set (0.00 sec) mysql> Create table test_timestamp(time TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); Query OK, 0 rows affected (0.64 sec) mysql> INSERT INTO test_timestamp (time) values (CURRENT_TIMESTAMP); Query OK, 1 row affected (0.06 sec) mysql> Select * from test_timestamp; +---------------------+ | time | +---------------------+ | 2017-11-14 17:29:50 | +---------------------+ 1 row in set (0.00 sec)
现在,在以下查询中,我们将时区更改为 UTC-05:00,并且具有 TIMESTAMP 数据类型的表的结果也发生了更改。
mysql> SET @@session.time_zone = '-5:00'; Query OK, 0 rows affected (0.00 sec) mysql> Select * from test_timestamp; +---------------------+ | time | +---------------------+ | 2017-11-14 06:59:50 | +---------------------+ 1 row in set (0.00 sec)
输出
mysql> Select * from test_datetime; +---------------------+ | time | +---------------------+ | 2017-11-14 17:29:03 | +---------------------+ 1 row in set (0.00 sec)