【MySQL】Unknown or incorrect time zone: 'Asia/Tokyo'
エラーの解決方法
🕒 はじめに
CakePHP や Laravel などのフレームワークで MySQL を利用していると、次のようなエラーに出会うことがあります。
SQLSTATE[HY000]: General error: 1298 Unknown or incorrect time zone: 'Asia/Tokyo'
これは「MySQLが Asia/Tokyo というタイムゾーンを知らない」ために発生します。
実は MySQL は OS のタイムゾーンを直接参照せず、独自の time_zone テーブルを使っています。そのため、必要なデータを流し込んであげる必要があります。
✅ 原因
- Linux(OS) の
date
コマンドで JST になっていても、MySQL が内部にタイムゾーン情報を持っていないとエラーになる -
Asia/Tokyo
などのタイムゾーンは/usr/share/zoneinfo
に存在するが、MySQL のmysql.time_zone*
テーブルにロードされていない
✅ 解決方法
1. タイムゾーン情報を MySQL にロード
以下のコマンドを実行します:
sudo mysql_tzinfo_to_sql /usr/share/zoneinfo | sudo mysql -u root -p mysql
これで OS が持っているタイムゾーンデータを MySQL 内部に取り込みます。
2. 確認
MySQL にログインして確認してみます:
SELECT * FROM mysql.time_zone_name WHERE Name = 'Asia/Tokyo';
もしレコードが返ってくれば OK です。
3. MySQL を再起動
sudo systemctl restart mysql
4. 再実行
CakePHP などで再度クエリを実行すると、エラーが解消されているはずです。
✅ 補足
-
time_zone = SYSTEM
の場合 → OS のタイムゾーンを参照 -
time_zone = 'Asia/Tokyo'
の場合 → MySQL のtime_zone
テーブルに登録された値を参照
今回のエラーは後者の場合に発生します。
🎯 まとめ
- MySQLは内部にタイムゾーン情報を持つ必要がある
-
Unknown or incorrect time zone
エラーは mysql_tzinfo_to_sql で解決 - 実行コマンドはこれだけ 👇
sudo mysql_tzinfo_to_sql /usr/share/zoneinfo | sudo mysql -u root -p mysql
これで安心して Asia/Tokyo
を使えるようになります 🚀