デフォルトでは(少なくともDebianベースのインストールでは)タイムゾーンデータはMySQLにロードされません。それらがロードされているかどうかをテストする場合は、実行してみてください:
SELECT CONVERT_TZ('2012-06-07 12:00:00', 'GMT', 'America/New_York');
DATETIME
を返す場合 (この場合、2012-06-07 08:00:00
)、タイムゾーンが読み込まれています。 NULL
を返す場合 、そうではありません。ロードされていない場合、オフセットを使用した変換に制限されます(例:+10:00
または-6:00
。
これは多くの場合正常に機能するはずですが、夏時間の心配がない場合など、名前付きのタイムゾーンを使用する方がよい場合もあります。次のコマンドを実行すると、システムからタイムゾーンデータが読み込まれます(Unixのみ。同等のWindowsコマンドが何であるかはわかりません):
mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql
MySQLのタイムゾーンに継続的に依存する必要がある場合は、上記のコマンドをシステムのタイムゾーンが更新されるたびに実行する必要があります。 。毎週または毎月のcronジョブに追加するだけで、自動的に実行することもできます。
次に、タイムゾーンのリストを表示するには、次の手順を実行します。
USE mysql;
SELECT * FROM `time_zone_name`;
MySQLではタイムゾーン情報が約5MBを占めることに注意してください。タイムゾーン情報をアンロードしたい場合は、以下を実行してMySQLを再起動してください。
TRUNCATE `time_zone` ;
TRUNCATE `time_zone_leap_second` ;
TRUNCATE `time_zone_name` ;
TRUNCATE `time_zone_transition` ;
TRUNCATE `time_zone_transition_type` ;
DROP
しないでください これらのテーブル または悪いことが起こります。
編集:
以下のユーザーコメントに基づいて、システムを更新するときにタイムゾーンを自動的に更新する場合は、最初に、パスワードの入力を求められずにrootがログインできるようにする必要があります。
MySQL> =5.6.6
次の[
mysql_config_editor set --login-path=client --host=localhost --user=root --password
MySQL <5.6.6
~/.my.cnf
を作成します ファイル(まだ存在しない場合)を追加し、以下を追加します:
[client]
user=root
password=yourMysqlRootPW
次に、chmod 600 ~/.my.cnf
を実行します 他の誰もそれを読めないようにするためです。
更新スクリプト
次のスクリプトをcrontabに追加して、1日1回実行します。
#!/bin/bash
# Find if there are any timezone files that have been modified in the last 24
# hours and do not have ".tab" in the name (since these are not timezone files)
if [ `find /usr/share/zoneinfo -mtime -1 | grep -v '\.tab' | wc -l` -gt 0 ]; then
echo "Updating MySQL timezone info"
# Note, suppressing STDERR here because of the .tab files above
# that cause warnings.
mysql_tzinfo_to_sql /usr/share/zoneinfo 2>/dev/null | mysql -u root mysql
echo "Done!\n"
fi
echo
を削除します 出力が必要ない場合は行。
注:これは(ほとんど)テストされていません。問題があればお知らせください。この回答を更新します。