タイムゾーンのサポート
TiDB のタイムゾーンは、 time_zone
システム変数によって決定されます。セッションレベルまたはグローバルレベルで設定できます。 time_zone
のデフォルト値はSYSTEM
です。 SYSTEM
に対応する実際のタイムゾーンは、TiDB クラスターのブートストラップが初期化されるときに構成されます。詳細なロジックは次のとおりです。
- TiDB は
TZ
環境変数の使用を優先します。 TZ
環境変数が失敗した場合、TiDB は/etc/localtime
のソフト リンクからタイム ゾーンを読み取ります。- 上記の両方の方法が失敗した場合、TiDB はシステム タイム ゾーンとして
UTC
使用します。
タイムゾーン設定をビュー
グローバル、クライアント固有、およびシステムのタイムゾーンの現在の値を表示するには、次のステートメントを実行します。
SELECT @@global.time_zone, @@session.time_zone, @@global.system_time_zone;
タイムゾーンを設定する
TiDB では、 time_zone
システム変数の値は次のいずれかの形式で設定できます。
SYSTEM
(デフォルト値) は、タイム ゾーンがシステムのタイム ゾーンと同じであることを示します。- UTC オフセット (
'+10:00'
や'-6:00'
など)。 'Europe/Helsinki'
、'US/Eastern'
、'MET'
などの名前付きタイムゾーン。
ニーズに応じて、次のように TiDB のタイムゾーンをグローバル レベルまたはセッション レベルで設定できます。
TiDB のタイムゾーンをグローバル レベルで設定します。
SET GLOBAL time_zone = ${time-zone-value};たとえば、グローバル タイム ゾーンを UTC に設定します。
SET GLOBAL time_zone = 'UTC';セッション レベルで TiDB のタイム ゾーンを設定します。
SET time_zone = ${time-zone-value};たとえば、現在のセッションのタイムゾーンを US/Pacific に設定します。
SET time_zone = 'US/Pacific';
タイムゾーン設定の影響を受ける関数とデータ型
現在のセッションのタイム ゾーン設定は、 NOW()
およびCURTIME()
関数によって返される値など、ゾーンに依存する時間値の表示と解釈に影響します。タイム ゾーンを変換するには、 CONVERT_TZ()
関数を使用します。UTC に基づくタイムスタンプを取得するには、 UTC_TIMESTAMP()
関数を使用します。これにより、タイム ゾーン関連の問題を回避できます。
TiDB では、 TIMESTAMP
データ型の表示値はタイムゾーン設定の影響を受けます。これは、 TIMESTAMP
データ型がリテラル値とタイムゾーン情報を使用するためです。 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)
この例では、タイムゾーンの値をどのように調整しても、 DATETIME
データ型の値は影響を受けません。ただし、 TIMESTAMP
データ型の表示値はタイムゾーンの変更を反映しています。実際、データベースに保存されているTIMESTAMP
値は変更されませんが、タイムゾーンの設定に応じて表示が異なります。
タイムゾーン設定に関する重要な考慮事項
TIMESTAMP
とDATETIME
の値の変換時にはタイムゾーンが関係し、これは現在のセッションのtime_zone
に基づいて処理されます。- データ移行では、プライマリ データベースとセカンダリ データベースのタイム ゾーン設定が一致しているかどうかに特に注意する必要があります。
- 正確なタイムスタンプを取得するには、ネットワーク タイム プロトコル (NTP) または高精度時間プロトコル (PTP) サービスを使用して信頼性の高いクロックを構成することを強くお勧めします。NTP サービスを確認する方法については、 NTPサービスを確認してインストールする参照してください。
- 夏時間を採用しているタイムゾーンを使用すると、特にそれらのタイムスタンプを使用して計算を実行する場合に、タイムスタンプがあいまいになったり、タイムスタンプが存在しなくなったりする可能性があることに注意してください。
- MySQL は
mysql_tzinfo_to_sql
使用して、オペレーティング システムのタイム ゾーン データベースをmysql
データベースのテーブルに変換します。一方、TiDB は、オペレーティング システムのタイム ゾーン データベースからタイム ゾーン データ ファイルを直接読み取り、Go プログラミング言語に組み込まれたタイム ゾーン処理機能を活用します。