先日の Unbale ... の記事でも書いた通り、インストール直後の MySQL は Asia/Tokyo をタイムゾーンに指定するとエラーを返します。
ゆるせねえよ……、わからせてやる!
しかしこの手の話題、 OS とか物理筐体移行する際に毎回書いてる気がするんだよな。
zoneinfo を読み込ませる
zoneinfo ファイルを mysql データベースに流し込むことで、タイムゾーンを理解するようになります。
Warning が出るやんけ! とお思いでしょうが、実際出るものは仕方がない。 実害は無いのでスキップします。
❯ mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root mysql Warning: Unable to load '/usr/share/zoneinfo/+VERSION' as time zone. Skipping it. Warning: Unable to load '/usr/share/zoneinfo/iso3166.tab' as time zone. Skipping it. Warning: Unable to load '/usr/share/zoneinfo/leapseconds' as time zone. Skipping it. Warning: Unable to load '/usr/share/zoneinfo/zone.tab' as time zone. Skipping it.
もし production な環境に導入するので Warning 出たりしたら困るもしくは Windows や! というのであれば、以下公式が書いている通り、 DevelopperZone から SQL ファイルをダウンロードして読み込ませましょう。
確認
mysql.time_zone
テーブルに 600 件近いデータが入っていれば成功です。 インストール直後は空なので、極論、自分が必要なタイムゾーンさえ追加されていればインポート途中で失敗しても大丈夫だと思う。
mysql> SELECT COUNT(*) FROM mysql.time_zone; +----------+ | COUNT(*) | +----------+ | 598 | +----------+ 1 row in set (0.00 sec)
設定
my.cnf にタイムゾーン設定を入れて mysqld プロセスを再起動すればオッケーです。
フレームワークのタイムゾーン設定や言語のデフォルトに依存すると、 本番環境の RDS などに持ち込んだ時 UTC
になって JST と 9 時間ずれる〜、みたいな事になりがち。 なるべく気をつけましょう!
my.cnf
# timezone default_time_zone='Asia/Tokyo'
変更前
macOS を JST で利用しているので、 system_time_zone が JST ですね。 前述の通り、ここに依存するとアブナイ。
mysql> SHOW VARIABLES LIKE "%time_zone%"; +------------------+--------+ | Variable_name | Value | +------------------+--------+ | system_time_zone | JST | | time_zone | SYSTEM | +------------------+--------+ 2 rows in set (0.01 sec)
変更後
日本向けの時間になりました、これでオッケー。
mysql> SHOW VARIABLES LIKE "%time_zone%"; +------------------+------------+ | Variable_name | Value | +------------------+------------+ | system_time_zone | JST | | time_zone | Asia/Tokyo | +------------------+------------+ 2 rows in set (0.00 sec)