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