mysql connector/j 8 serverTimezone

 2019/09/05, last updated 2022/08/03 -  moriya -  ~2 Minutes

AWS RDS で mysql を使っていたのだが、以前はタイムゾーンを変えることができなかった。そのため、無理矢理 JST で日付や時刻をセットしている WEB アプリがあった。( Amazon RDS データベースインスタンスのタイムゾーンを変更する方法   によると今はサーバのタイムゾーンを変えられるらしい。)

この環境で動く Java の WEB アプリで mysql connector/j をバージョン 5 系からバージョン 8 系に変更したところ、時刻が正しく UTC でセットされるようになってしまった。

(current_timestamp などを指定すると UTC でセットされるだろうから、正しくないのを承知で)無理矢理 JST でセットしてほしいのだが、接続文字列を jdbc:mysql://〜&serverTimezone=Asia/Tokyo のようにすればよいようだ。

リファレンス: connector/j reference configuration properties  

Changes in Connection Properties   によると、8系では、5系にあった、useLegacyDatetimeCode プロパティは削除された。

念のため、 ソース   も見てみたが、動きとしては(詳細まで追ってはいないが)、次のように動作するのではないだろうか。

  1. サーバのタイムゾーン(time_zoneパラメータか?)を取得してそのタイムゾーンに変換しようとする。
  2. serverTimezone が指定されていると、その値をサーバのタイムゾーンとみなして変換しようとする。

私の場合は、実際そのように動作していた。