MySQL 的 DATETIME 和 TIMESTAMP 数据类型有什么区别?
这两种数据类型都以“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 个字节。另一方面,timestamp 数据类型需要 4 个字节,以及用于存储小数秒数据的额外 3 个字节。但在 MySQL 5.6.4 之前,DateTime 需要 8 个字节,以及用于存储小数秒数据的额外 3 个字节。
- 从一个时区转换为另一个时区 - 实际上在 MySQL5+ 中,timestamp 值会从当前时间转换为 UTC,反之亦然,而 datetime 则不会进行任何转换。
- 索引 - 可以对 timestamp 数据进行索引,但不能对 datetime 数据进行索引。
- 查询缓存 - 具有 timestamp 数据类型的查询可以被缓存,但具有 datetime 数据类型的查询不能被缓存。
以上是 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)
广告