MySQL サーバにはいくつかのタイム ゾーンがあります。
システムのタイム
ゾーン。サーバ起動時に、ホスト
マシンのタイム
ゾーンを使用して、system_time_zone
システム変数で設定する。それ以降にこの値が変更することはない。
起動時の MySQL Server のシステム タイム
ゾーンは、mysqld_safe
で、--timezone=
を使用する。または、mysqld
を起動する前に、timezone_name
TZ
環境変数で設定する。--timezone
と TZ
の許容値は、システムに依存するため、OS
のドキュメントを参照のこと。
サーバのカレント タイム
ゾーン。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
からカレントのタイム
ゾーンに変換します。カレントのタイム ゾーン
セッティングは、DATE
,
TIME
, or DATETIME
などのカラム値、または
UTC_TIMESTAMP()
関数などによって表示する値には影響しません。
グローバルおよびクライアント指定のタイム ゾーンのカレント値は、次のように読み出します。
mysql> SELECT @@global.time_zone, @@session.time_zone;
timezone
値には、いくつかの形式があります。次に示す形式では文字区別はありません。
'SYSTEM'
値は、システム
タイム ゾーンと同じ値を示す。
UTC
オフセットを示す文字列の値。たとえば、'+10:00'
または '-6:00'
など。
指定したタイム
ゾーンの値。たとえば、'Europe/Helsinki'
、
'US/Eastern'
、'MET'
など。指定したタイム ゾーンは、タイム
ゾーンの情報テーブルが mysql
データベースにあるときにだけ使用できる。
MySQL のインストール手順でタイム ゾーン
テーブルを mysql
データベースに作成しますが、そのときは、ロードまではしません。その前に、テーブルを作成する必要があります。MySQL
4.1.3
以降にアップグレードする場合は、mysql
データベースを更新すると、そのテーブルを作成できます。アップグレードに関する手順は、項4.5.4. 「mysql_upgrade — MySQL アップグレードのテーブル チェック」
を参照してください。次に、テーブル作成してから、タイム
ゾーン テーブルをロードするまでの手順 (手動)
を示します。
タイム ゾーンの情報をロードは、情報が変更する場合に応じて、変更します。たとえば、夏時間を導入している米国、メキシコ、カナダでは 2007年に導入ルールが変更しました。そのような変更がある場合、古いルールを使用しているアプリケーションとの誤差がでるため、MySQL サーバの時間で使用している情報を維持するために、タイム ゾーン テーブルをリロードする必要があります。このセクションで後述のノートを参照してください。
システムに独自の zoneinfo
データベース (タイム ゾーンの関するファイル
セット)
がある場合、mysql_tzinfo_to_sql
プログラムを使用して、タイム ゾーン
テーブルの充てんを行います。Linux、FreeBSD、Sun
Solaris、Mac OS X
などのシステムでは、通常、タイム
ゾーンに関するファイルは、/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
Windows または HP-UX など、zoneinfo データベースを使用しないシステムの場合は、パッケージのタイム ゾーン テーブルを使用します。これは、MySQL Developer Zone からダウンロードできます。
http://dev.mysql.com/downloads/timezones.html
このタイム ゾーン パッケージには、
MyISAM
のタイム ゾーン
テーブル用に、.frm
、.MYD
、.MYI
などのファイルが入っています。このテーブルを
mysql
データベースの一部にする必要があるため、そのファイルをMySQL
サーバのデータ ディレクトリの
mysql
サブ
ディレクトリに入れてください。そのときは、サーバを停止してから作業を行い、再起動してください。
警告: システムに zoneinfo データベースがある場合は、ダウンロード パッケージを使用してはいけません。MySQL とシステム アプリケーション間での時間に関わる処理に誤差が生じる原因になります。代わりに、mysql_tzinfo_to_sql ユーティリティを使用してください。
レプリケーションを行うときのタイム ゾーン セッティングに関する情報は、項5.4.1. 「レプリケーション機能と既知問題」 を参照してください。
タイム ゾーン変更に対応
タイム ゾーンのルールに変更があるときは、古いルールを使用しているアプリケーションでも調節が必要になります。タイム ゾーンのずれを回避するために、システムのタイム ゾーン情報がカレント(最新の時間)であることを確認してください。MySQL では、タイム ゾーンをカレントにする必要がある要素が 2 つあります。
MySQL サーバでタイム ゾーンを
SYSTEM
で設定している場合は、オペレーティング
システムの時間が、MySQL
で使用する時間の値に影響するため、オペレーティング
システムが最新 (アップデート) のタイム
ゾーンを使用していることを確認する必要がある。大抵のオペレーティング
システムでは、アップデートやサービス
パックで時間変更に対応している。時間変更に関するアップデートなどオペレーティング
システムのベンダー
ウェブサイトを確認する。インターネットのパブリック
タイムでサーバを稼動させている場合、システムが自動的に調整を行う。
MySQL で特定のタイム
ゾーンを使用する場合、mysql
データベースのタイム ゾーン
テーブルのアップデートを行う。システムに独自の
zeroinfo データベースがある場合は、 zeroinfo
データベース
をアップデートする度に、このセクションで前述した手順に従って、MySQL
のタイム ゾーン テーブルをリロードする。
zeroinfo データベースがない場合は、MySQL
Developer Zone
のアップデート情報に従う。アップデートがある場合は、ダウンロードして、カレントのタイム
ゾーン テーブルと置き換える。