時區支持
使用的時區由 time_zone
全局變量和 session 變量決定。time_zone
的默認值是 System
,System
對應的實際時區在 TiDB
集羣 bootstrap 初始化時設置。具體邏輯如下:
- 優先使用
TZ
環境變量 - 如果失敗,則從
/etc/localtime
的實際軟鏈地址提取。 - 如果上面兩種都失敗則使用
UTC
作爲系統時區。
在運行過程中可以修改全局時區:
mysql> set global time_zone='+8:00'; # 因爲UTC時區 修改時間 建議使用
mysql> SET GLOBAL time_zone = timezone; # 根據具體情況使用,不建議禁止使用
TiDB 還可以通過設置 session 變量 time_zone
爲每個連接維護各自的時區。默認條件下,這個值取的是全局變量 time_zone
的值。修改 session 使用的時區:
mysql> SET time_zone = timezone;
查看當前使用的時區的值:
mysql> SELECT @@global.time_zone, @@session.time_zone;
設置 time_zone
的值的格式:
- 'SYSTEM' 表明使用系統時間
- 相對於 UTC 時間的偏移,比如 '+10:00' 或者 '-6:00'
- 某個時區的名字,比如 'Europe/Helsinki', 'US/Eastern' 或 'MET'
NOW()
和 CURTIME()
的返回值都受到時區設置的影響。
注意,只有 Timestamp 數據類型的值是受時區影響的。可以理解爲, Timestamp 數據類型的實際表示使用的是 (字面值 + 時區信息)。其它時間和日期類型,比如 Datetime/Date/Time 是不包含時區信息的,所以也不受到時區變化的影響。
mysql> select now(); # 當前
+---------------------+
| now() |
+---------------------+
| 2018-12-25 11:11:11 |
+---------------------+
1 row in set (0.00 sec)
mysql> create table t (ts timestamp, dt datetime);
Query OK, 0 rows affected (0.02 sec)
mysql> set @@time_zone = 'UTC';
Query OK, 0 rows affected (0.00 sec)
mysql> insert into t values ('2018-12-25 11:11:11', '2018-12-25 11:11:11');
Query OK, 1 row affected (0.00 sec)
mysql> set @@time_zone = '+8:00';
Query OK, 0 rows affected (0.00 sec)
mysql> select * from t;
+---------------------|---------------------+
| ts | dt |
+---------------------|---------------------+
| 2018-12-25 11:11:11 | 2018-12-25 11:11:11 |
+---------------------|---------------------+
1 row in set (0.00 sec)
上面的例子中,無論怎麼調整時區的值, Datetime 類型字段的值是不受影響的,而 Timestamp 則隨着時區改變,顯示的值會發生變化。其實 Timestamp 持久化到存儲的值始終沒有變化過,只是根據時區的不同顯示值不同。
Timestamp 類型和 Datetime 等類型的值,兩者相互轉換的過程中,會涉及到時區。這種情況一律基於 session 的當前 time_zone
時區處理。
另外,在導數據的過程中,也要需注意主庫和從庫之間的時區設定是否一致。