[每日短篇] 16 - MySQL 的 TIMESTAMP 和 DATETIME 類型的一點不一樣

TIMESTAMP 類型表示的是一個時間點,這個時間點所表明的時間跟它的表示方式無關,就像一個數值跟用幾進製表示無關同樣。舉個例子,若是一個時間戳用 CST 表示是 2018-11-22T08:00:00+08:00,那麼這個時間戳所表明的時間點也能夠表示爲 2018-11-22T00:00:00Z。在 MySQL 中,無論當前系統時區是哪一個時區,TIMESTAMP 類型都會以 UTC 時區存儲以當前時區顯示,而 DATETIME 保存的是一個時間表示,不會作這種轉換。再來看一個例子,系統當前時區爲 CSTcode

查看時區信息it

MariaDB [devkit]> show variables like 'time_zone';
+---------------+--------+
| Variable_name | Value  |
+---------------+--------+
| time_zone     | +08:00 |
+---------------+--------+
1 row in set (0.001 sec)

建立表並插入數據table

MariaDB [devkit]> CREATE TABLE `test_table` (
    ->   `id` int(11) NOT NULL AUTO_INCREMENT,
    ->   `timestamp` timestamp NULL DEFAULT NULL,
    ->   `datetime` datetime DEFAULT NULL,
    ->   PRIMARY KEY (`id`)
    -> ) ENGINE=InnoDB;
Query OK, 0 rows affected (0.055 sec)

MariaDB [devkit]> insert into `test_table` (`timestamp`, `datetime`) values ('2018-11-22 08:00:00', '2018-11-22 08:00:00');
Query OK, 1 row affected (0.005 sec)

查看數據test

MariaDB [devkit]> select * from `test_table`;
+----+---------------------+---------------------+
| id | timestamp           | datetime            |
+----+---------------------+---------------------+
|  1 | 2018-11-22 08:00:00 | 2018-11-22 08:00:00 |
+----+---------------------+---------------------+
1 row in set (0.000 sec)

修改時區並再次查看數據date

MariaDB [devkit]> set time_zone = 'UTC';
Query OK, 0 rows affected (0.000 sec)

MariaDB [devkit]> select * from `test_table`;
+----+---------------------+---------------------+
| id | timestamp           | datetime            |
+----+---------------------+---------------------+
|  1 | 2018-11-22 00:00:00 | 2018-11-22 08:00:00 |
+----+---------------------+---------------------+
1 row in set (0.000 sec)

比較 2 次的顯示能夠發現,TIMESTAMP 類型的值在不一樣的時區下顯示不一樣,無論哪一種表示指向的都是同一個時間點。DATETIME 類型的值在不一樣的時區下顯示相同,能夠理解爲表明的是時鐘上的一個固定的時間表示。select

相關文章
相關標籤/搜索