MySQL 5.6 リファレンスマニュアル  /  グローバリゼーション  /  MySQL Server でのタイムゾーンのサポート

10.6 MySQL Server でのタイムゾーンのサポート

MySQL Server は複数のタイムゾーン設定を保持しています。

  • システムタイムゾーン。サーバーは、起動するときに、ホストマシンのタイムゾーンを特定し、これを使用して system_time_zone システム変数で設定しようとします。その後、この値は変更しません。

    mysqld_safe--timezone=timezone_name オプションを使用すると、起動時に MySQL Server のシステムタイムゾーンを設定できます。mysqld を起動する前に、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() 関数などによって表示される値、または DATETIMEDATETIME カラムの値には影響しません。また、これらのデータ型の値も UTC で格納されません。タイムゾーンは、TIMESTAMP 値から変換するときにのみ適用されます。DATETIME、または 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 でダウンロードに使用できる事前に構築されたタイムゾーンテーブルのパッケージを使用できます。

http://dev.mysql.com/downloads/timezones.html

このタイムゾーンパッケージには、MyISAM のタイムゾーンテーブル用に、.frm.MYD.MYI などのファイルが含まれています。これらのテーブルを mysql データベースの一部にする必要があるため、ファイルを MySQL Server のデータディレクトリの mysql サブディレクトリに入れてください。サーバーを停止してからこれを行い、そのあとで再起動します。

警告

システムに zoneinfo データベースがある場合は、ダウンロード可能なパッケージを使用しないでください。代わりに、mysql_tzinfo_to_sql ユーティリティーを使用してください。そうしないと、MySQL とシステム上のほかのアプリケーション間で日時処理に違いが生じることがあります。

レプリケーションセットアップのタイムゾーン設定の詳細は、セクション17.4.1「レプリケーションの機能と問題」を参照してください。


User Comments
  Posted by Chris Calender on March 11, 2009
After updating your OS with DST changes, you must also restart mysqld for the changes to take effect.

Restarting may not be possible at the time, so a short-term workaround (for only some cases) is to set the OS timezone back 1 hour.

Note this only works for some cases, and if you're accepting timestamped data from countries who do not observe DST yet, then the timestamps will be 1 hour off. However, if this is not the case for you, then the work-around might be a temporary solution.
  Posted by Daevid Vincent on October 19, 2010
Note that if you are trying to keep your own database of cities and their timezones, you can NOT use the mysql.time_zone_name.Time_zone_id as your FK because the key will change the next time you get a "tzdata" update and re-run "mysql_tzinfo_to_sql tz_file". You'll have to store the "Name" column instead otherwise you loose data integrity.

That script wipes the tables and re-creates them! rather than doing an UPDATE to existing records as you would reasonably expect.

*sigh*
  Posted by Winfred Qin on November 11, 2010
If you want to set your timezone to UTC, both '+00:00' or '-00:00' will be OK. But DO NOT use '00:00'.
  Posted by Joe Peebles on April 11, 2012
A note for Windows users:
Your MySQL Server's data directory may be in C:\ProgramData, and not in C:\Program Files. If you download the time zone description tables, and follow all the steps for stopping/starting the server and loading the files into the data directory, and see empty tables when you query any of the time zone tables, this may be your problem. Here's where my data directory was lurking:

C:\ProgramData\MySQL\MySQL Server 5.5\data\mysql
  Posted by Nigel Pearson on April 4, 2013
If the data piped from mysql_tzinfo_to_sql gives an SQL error, put it into a file first, and edit any offending lines.

e.g.: ...at line 38408: Data too long for column 'Abbreviation' at row 1
was caused by this line generated from MacOSX 10.8's timezone files:
(@time_zone_id, 0, 0, 0, 'Local time zone must be set--see zic manual page')
which I changed to: (@time_zone_id, 0, 0, 0, 'UNSET')
  Posted by Chris Calender on April 29, 2013
"The permissible values for --timezone or TZ are system dependent."

For Windows, if you have (or create) an environment variable named TZ, some permissible values are:

EST5EDT
CST6CDT
MST7MDT
PST8PDT

From my tests, if it is daylight savings at the time the server is started, then system_time_zone will report EDT. However, if it is started when it is not daylight savings, it will report EST. In either case, "select now()" returned the correct times for me, regardless of whether it displays EDT or EST.
  Posted by Peter NOT_FOUND on September 27, 2013
Mac OSX timezone zoneinfo fix using this one-liner

mysql_tzinfo_to_sql /usr/share/zoneinfo | sed -e "s/Local time zone must be set--see zic manual page/local/" | mysql -u root mysql
  Posted by Kent Boortz on March 8, 2015
The "Local time zone must be set--see zic manual page" problem is corrected in 5.7.6-m16 (Bug#20545 and Bug#68861)
Sign Up Login You must be logged in to post a comment.