MySQLでタイムゾーンを設定する2つの方法!【日本時間設定】

MySQLMySQL

MySQLでタイムゾーンを確認したり、設定する方法について書いています。
MySQLでタイムゾーンを設定するときには、SETを使って一時的に設定するか、設定ファイル(my.cnf)で設定する方法があります。

公式ドキュメントでは、タイムゾーンについての記事がこちらにありました。
載せているSQLについては、MySQLのバージョン8.0.32を使って動作を確認しています。(Mac OS)

現在のタイムゾーンを確認する

下記のSQLで現在のタイムゾーンを確認することができます。

SELECT @@GLOBAL.time_zone, @@SESSION.time_zone;

実行すると、このように設定されているタイムゾーンが確認できます。

mysql> SELECT @@GLOBAL.time_zone, @@SESSION.time_zone;
+--------------------+---------------------+
| @@GLOBAL.time_zone | @@SESSION.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+
1 row in set (0.00 sec)

現在のグローバル変数もセッション変数も’SYSTEM’になっています。
デフォルトでは’SYSTEM’なので、MySQLのタイムゾーンはMySQLが動いているシステムのタイムゾーンと同じになります。

MySQLのタイムゾーンを設定する

MySQLのタイムゾーンを設定するには、設定ファイル(my.cnf)に書いて起動時に効くようにしておくか、SETを使って一時的にタイムゾーンを設定することができます。

タイムゾーンを設定する準備をする

まず、タイムゾーン情報があるか確認します。
タイムゾーンの情報がないと、タイムゾーンを設定できません。

SELECT COUNT(*) FROM mysql.time_zone_name;

SQLを実行して、タイムゾーンがカウントが0じゃなければタイムゾーン情報があります。

mysql> SELECT COUNT(*) FROM mysql.time_zone_name;
+----------+
| COUNT(*) |
+----------+
|      598 |
+----------+
1 row in set (0.00 sec)

日本のタイムゾーンが設定できるかは、下記のSQLで確認できます。
SQLを実行すると、存在していることが確認できました。

mysql> SELECT * FROM mysql.time_zone_name WHERE Name = 'Asia/Tokyo';
+------------+--------------+
| Name       | Time_zone_id |
+------------+--------------+
| Asia/Tokyo |          322 |
+------------+--------------+
1 row in set (0.01 sec)

タイムゾーンがないとき

mysql.time_zone_nameのテーブルを確認して、カウントが0件のときです。
この場合には、下記のようにターミナルで実行して、タイムゾーン情報をシステムから共有できました。(Macで確認しました)

mysql_tzinfo_to_sql /usr/share/zoneinfo | mysql -u root -p mysql

グローバル変数・セッション変数に設定する

グローバル変数に設定するには、下記のようにSQLを実行します。
Asia/Tokyoを設定してみました。

SET GLOBAL time_zone = 'Asia/Tokyo';

セッション変数に設定するには、下記のようにSQLを実行します。

SET time_zone = 'Asia/Tokyo';

確認すると、下記のようにどちらの変数にもAsia/Tokyoが設定されています。

mysql> SELECT @@GLOBAL.time_zone, @@SESSION.time_zone;
+--------------------+---------------------+
| @@GLOBAL.time_zone | @@SESSION.time_zone |
+--------------------+---------------------+
| Asia/Tokyo         | Asia/Tokyo          |
+--------------------+---------------------+
1 row in set (0.00 sec)

変数に設定した内容は、MySQLを起動しなおすと設定がデフォルト(SYSTEM)に戻るので、注意が必要です。

設定ファイル(my.cnf)で設定する

使いたいタイムゾーンを設定ファイルに記載しておくと、サーバー起動時に設定してくれます。
設定ファイル(my.cnf)の場所については、こちらの記事を確認してみてください。

設定ファイル(my.cnf)に下記のように記載します。

[mysqld]                                                                                                    
default-time-zone='Asia/Tokyo'

設定ファイルを変えた後に、MySQLを再起動します。
再起動後に設定内容を確認すると、下記のようにAsia/Tokyoが設定されました。

mysql> SELECT @@GLOBAL.time_zone, @@SESSION.time_zone;
+--------------------+---------------------+
| @@GLOBAL.time_zone | @@SESSION.time_zone |
+--------------------+---------------------+
| Asia/Tokyo         | Asia/Tokyo          |
+--------------------+---------------------+
1 row in set (0.00 sec)

MySQLでタイムゾーンを設定する方法まとめ

今回はMySQLでタイムゾーンを設定する方法について書きました。
記事の内容をまとめると、下記のようになります。

・タイムゾーンを確認するには、SELECTで`@@GLOBAL.time_zone`と`@@SESSION.time_zone`の設定値を見る。
・MySQLを再起動せずに、SETを使って一時的に設定することができる。
・設定ファイルに書くと、MySQLの起動時に設定したタイムゾーンが読み込まれる。

タイムゾーンは基本的には永続的に設定したいのかと思うので、設定ファイル(my.cnf)に書いておくほうが良いのかなと思いました。

コメント

タイトルとURLをコピーしました