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个额外字节来存储分数秒数据。但在MySQL5.6.4之前,DateTime需要8个字节,还需要3个额外字节来存储分数秒数据。
- 从一个时区转换为另一个时区 − 在MySQL5+中,实际上,timestamp值从当前时间转换为UTC时间,反之亦然,但datetime不做任何转换。
- 索引 − 可以在timestamp数据上进行索引,但不能在datetime数据上进行索引。
- 查询缓存 − 具有timestamp数据类型的查询可以被缓存,但具有datetime数据类型的查询不能被缓存。
以上是DATETIME和TIMESTAMP数据类型之间的一些主要区别,下面的示例将加以说明−
阅读更多:MySQL 教程
示例
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)
极客教程