タイムゾーンのサポート
TiDBのタイムゾーンは、グローバルtime_zoneシステム変数とセッションtime_zoneシステム変数によって決定されます。デフォルト値のtime_zoneはSYSTEMです。 Systemに対応する実際のタイムゾーンは、TiDBクラスタのブートストラップが初期化されるときに構成されます。詳細なロジックは次のとおりです。
TZの環境変数の使用を優先します。TZの環境変数に障害が発生した場合は、実際のソフトリンクアドレス/etc/localtimeからタイムゾーンを抽出します。- 上記の両方の方法が失敗した場合は、システムタイムゾーンとして
UTCを使用します。 
次のステートメントを使用して、実行時にグローバルサーバーtime_zoneの値を設定できます。
SET GLOBAL time_zone = timezone;
各クライアントには、セッションtime_zone変数で指定された独自のタイムゾーン設定があります。最初は、セッション変数はグローバルtime_zone変数から値を取得しますが、クライアントは次のステートメントを使用して独自のタイムゾーンを変更できます。
SET time_zone = timezone;
次のステートメントを使用して、グローバル、クライアント固有、およびシステムのタイムゾーンの現在の値を表示できます。
SELECT @@global.time_zone, @@session.time_zone, @@global.system_time_zone;
time_zoneの値の形式を設定するには:
- 値「SYSTEM」は、タイムゾーンがシステムタイムゾーンと同じである必要があることを示します。
 - 値は、「+ 10:00」や「-6:00」など、UTCからのオフセットを示す文字列として指定できます。
 - 値は、「ヨーロッパ/ヘルシンキ」、「米国/東部」、「MET」などの名前付きタイムゾーンとして指定できます。
 
現在のセッションのタイムゾーン設定は、ゾーンに依存する時間値の表示と保存に影響します。これには、 NOW()やCURTIME()などの関数によって表示される値が含まれます。
ノート:
タイムスタンプデータ型の値のみがタイムゾーンの影響を受けます。これは、タイムスタンプデータ型がリテラル値+タイムゾーン情報を使用するためです。 Datetime / Date / Timeなどの他のデータ型にはタイムゾーン情報がないため、それらの値はタイムゾーンの変更による影響を受けません。
create table t (ts timestamp, dt datetime);
Query OK, 0 rows affected (0.02 sec)
set @@time_zone = 'UTC';
Query OK, 0 rows affected (0.00 sec)
insert into t values ('2017-09-30 11:11:11', '2017-09-30 11:11:11');
Query OK, 1 row affected (0.00 sec)
set @@time_zone = '+8:00';
Query OK, 0 rows affected (0.00 sec)
select * from t;
+---------------------|---------------------+
| ts                  | dt                  |
+---------------------|---------------------+
| 2017-09-30 19:11:11 | 2017-09-30 11:11:11 |
+---------------------|---------------------+
1 row in set (0.00 sec)
この例では、タイムゾーンの値をどのように調整しても、日時データ型の値は影響を受けません。ただし、タイムゾーン情報が変更されると、タイムスタンプデータ型の表示値が変更されます。実際、ストレージに保存されている値は変更されず、タイムゾーンの設定によって表示が異なるだけです。
ノート:
- タイムゾーンは、セッションの現在の
 time_zoneに基づいて処理されるTimestampとDatetimeの値の変換中に関係します。- データ移行の場合、プライマリデータベースとセカンダリデータベースのタイムゾーン設定に特に注意する必要があります。