MySQL Server は複数のタイムゾーン設定を保持しています。
-
システムタイムゾーン。サーバーは、起動するときに、ホストマシンのタイムゾーンを特定し、これを使用して
system_time_zone
システム変数で設定しようとします。その後、この値は変更しません。mysqld_safe で
--timezone=
オプションを使用すると、起動時に MySQL Server のシステムタイムゾーンを設定できます。mysqld を起動する前に、timezone_name
TZ
環境変数を設定することによって設定することもできます。--timezone
またはTZ
に許可される値は、システムによって異なります。許容可能な値を確認するには、オペレーティングシステムのドキュメントを参照してください。 -
サーバーの現在のタイムゾーン。
time_zone
グローバルシステム変数は、サーバーが現在動作しているタイムゾーンを示します。time_zone
の初期値は'SYSTEM'
であり、これはサーバーのタイムゾーンがシステムタイムゾーンと同じであることを示します。コマンド行で
--default-time-zone=
オプションを使用すると、初期グローバルサーバータイムゾーン値を起動時に明示的に指定できます。または、オプションファイルで次の行を使用できます。timezone
default-time-zone='timezone'
SUPER
権限がある場合は、実行時に次のステートメントを使用すると、サーバータイムゾーンのグローバル値を設定できます。mysql> SET GLOBAL time_zone = timezone;
-
接続ごとのタイムゾーン。接続するそれぞれのクライアントには、
time_zone
セッション変数で指定された、それぞれのタイムゾーン設定があります。最初、セッション変数は、time_zone
グローバル変数から値を取得しますが、クライアントは次のステートメントを使用して、それぞれのタイムゾーンを変更できます。mysql> SET time_zone = timezone;
現在のセッションのタイムゾーン設定は、ゾーンを区別する時間値の表示とストレージに影響します。これには、NOW()
や CURTIME()
などの関数で表示される値や、TIMESTAMP
カラムに保存し、そこから読み出す値も含まれます。TIMESTAMP
カラムの値は、ストレージでは現在のタイムゾーンから UTC に、読み出しでは UTC から現在のタイムゾーンに変換されます。
現在のタイムゾーン設定は、UTC_TIMESTAMP()
関数などによって表示される値、または DATE
、TIME
、DATETIME
カラムの値には影響しません。また、これらのデータ型の値も UTC で格納されません。タイムゾーンは、TIMESTAMP
値から変換するときにのみ適用されます。DATE
、TIME
、または DATETIME
値に対してロケール固有の演算を実行する場合、これらの値を UTC に変換し、演算を実行してから、元に変換し直します。
グローバルおよびクライアント固有のタイムゾーンの現在値は、次のように取得できます。
mysql> SELECT @@GLOBAL.time_zone, @@SESSION.time_zone;
timezone
値は、次の複数の形式で指定でき、大文字と小文字を区別しません。
'SYSTEM'
値は、タイムゾーンをシステムタイムゾーンと同じにする必要があることを示します。この値は、
'+10:00'
や'-6:00'
など、UTC からのオフセットを示す文字列として指定できます。この値は、
'Europe/Helsinki'
、'US/Eastern'
、'MET'
などの名前付きのタイムゾーンとして指定できます。名前付きのタイムゾーンは、mysql
データベース内のタイムゾーン情報テーブルが作成され移入されている場合にのみ使用できます。
MySQL のインストール手順では、mysql
データベース内にタイムゾーンテーブルを作成しますが、これらをロードしません。次の手順を使用して、手動でこれを行う必要があります。(以前のバージョンから MySQL 4.1.3 以降にアップグレードする場合は、mysql
データベースをアップグレードすることでテーブルを作成できます。セクション4.4.7「mysql_upgrade — MySQL テーブルのチェックとアップグレード」の手順を使用してください。テーブルを作成したあとでロードできます。)
情報は変更することがあるので、タイムゾーン情報のロードは必ずしも 1 回だけの操作とはかぎりません。たとえば、米国、メキシコ、一部のカナダのサマータイムのルールは、2007 年に変更されました。このような変更が起きた場合、古いルールを使用したアプリケーションは旧式になり、MySQL Server で使用されている情報を最新の状態に維持するために、タイムゾーンテーブルをリロードする必要が生じることがあります。このセクションの最後のノートを参照してください。
システムに独自の zoneinfo データベース (タイムゾーンについて述べたファイルセット) がある場合、タイムゾーンテーブルに入力するために mysql_tzinfo_to_sql プログラムを使用する必要があります。このようなシステムには、Linux、FreeBSD、Solaris、OS X などがあります。これらのファイルの 1 つの適切な場所は /usr/share/zoneinfo
ディレクトリです。システムに zoneinfo データベースがない場合、このセクションで後述するダウンロード可能なパッケージを使用できます。
mysql_tzinfo_to_sql プログラムはタイムゾーンテーブルのロードに使用されます。コマンド行で、zoneinfo ディレクトリのパス名を mysql_tzinfo_to_sql に渡し、出力を mysql プログラムに送信します。例:
shell> mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql
mysql_tzinfo_to_sql は、システムのタイムゾーンファイルを読み取り、そのファイルから SQL ステートメントを生成します。mysql はこれらのステートメントを処理して、タイムゾーンテーブルをロードします。
mysql_tzinfo_to_sql を使用すると、単一のタイムゾーンファイルをロードしたり、うるう秒情報を生成したりできます。
-
タイムゾーン名
tz_name
に対応した単一のタイムゾーンファイルtz_file
をロードするには、次のように mysql_tzinfo_to_sql を呼び出します。shell> mysql_tzinfo_to_sql tz_file tz_name | mysql -u root mysql
このアプローチでは、サーバーが認識する名前付きゾーンごとに、個別のコマンドを実行してタイムゾーンファイルをロードする必要があります。
-
タイムゾーンがうるう秒に対応する必要がある場合は、次のようにうるう秒の情報を初期化します。ここで
tz_file
はタイムゾーンファイルの名前です。shell> mysql_tzinfo_to_sql --leap tz_file | mysql -u root mysql
mysql_tzinfo_to_sql の実行後、以前にキャッシュしたすべてのタイムゾーンデータを使用し続けないように、サーバーを再起動することをお勧めします。
zoneinfo データベース (Windows など) を含まないシステムの場合、MySQL Developer Zone でダウンロードに使用できる事前に構築されたタイムゾーンテーブルのパッケージを使用できます。
https://dev.mysql.com/downloads/timezones.html
このタイムゾーンパッケージには、MyISAM
のタイムゾーンテーブル用に、.frm
、.MYD
、.MYI
などのファイルが含まれています。これらのテーブルを mysql
データベースの一部にする必要があるため、ファイルを MySQL Server のデータディレクトリの mysql
サブディレクトリに入れてください。サーバーを停止してからこれを行い、そのあとで再起動します。
システムに zoneinfo データベースがある場合は、ダウンロード可能なパッケージを使用しないでください。代わりに、mysql_tzinfo_to_sql ユーティリティーを使用してください。そうしないと、MySQL とシステム上のほかのアプリケーション間で日時処理に違いが生じることがあります。
レプリケーションセットアップのタイムゾーン設定の詳細は、セクション17.4.1「レプリケーションの機能と問題」を参照してください。