歳を重ねるにつれて自分が苦労して経験したこととか頭の中に入っていた情報がポロポロとこぼれおちるようになってしまった。 なので、忘れないうちにメモをしようと決めて始めたこのブログ。
ちょうど最近ハマったネタがあるので載せておこう。 外向けのColdFusionサイトの運用環境をクラウドに移行しようと考え、AWSのLightsailを触り始めた。 EC2はほとんど触ったことがないので、少しでも簡単(そうに見える)物をってことで。 ColdFusionのライセンス持ち込んで (BYOL Bring-Your-Own-Licenseで)Webサーバーとして常時動かし続ける予定なので、コスト面に有利な、なるべく簡単そう(2度目)なものを選ぶことにした(このあたりはまた別の機会にメモしようと思う)。
Lightsailは、こちらの情報などが参考になるかと techblog.nhn-techorus.com
なんとかUbuntu20.04をセットアップしてColdFusion2021をインストール。 せっかくなので、DBもLightsailに用意されているMySQL 5.7を使用することに。 データのインポートも終わり、ColdFusionにMySQL Connector/J 5.1.49ドライバを入れて接続。 データの読み込みは問題なし。でも、データを書き込んだ時に文字が?????になってしまった。
調査開始
Lightsailに用意されていたMySQL5.7の文字コードはlatin1になっていた。まあ、このあたりは想像していた通り。
けれども、スキーマを作った時にちゃんと文字コードはutf8mb4にしたはずだし、その後インポートしたデータは日本語も問題なく表示できている。 実際にスキーマを確認しても問題はなさそうだ。
Lightsailではグローバル設定が変更できない
グローバル設定から変えてDBを作り直そうと思ったが、my.cnfを変えたくてもクラウドで用意されているMySQLにはSSHとかで接続できない。 AWSでは、Amazon RDSであれば「パラメータグループ」というので設定そうだが、Lightsailにはそれに相当する機能はなさそうだ。
そんな時
あきらめてUbuntuにMySQLも入れてしまおうかと思ったけれども、ふと、違うJDBCドライバだったらどうなる? と思い、MariaDB Connector/Jで試したところ、読み込み時も書き込み時も文字化けは発生しなかった。
ColdFusion で MariaDB Connector/Jを使った接続方法はこちら forum.samuraiz.co.jp
そういえば、MySQL Connector/J 5.1.49を入れたけど、Maria Connector/Jは新しいドライバのほうが互換性の問題も少ないか?と思い、2.7.5を入れた。もしかしたら、5.1系のJDBCドライバだとこういう問題があるのかな? なんか、以前もこういう問題があったなあ、と、過去のメールとか自分の作業履歴を探したところ、5年前のメールから下記の記事を発見。
ページ中の”JDBCドライバ(Connector/J)の対応”に書かれている接続文字列(characterEncoding=UTF-8&connectionCollation=utf8mb4_general_ci)をColdFusionに登録したMySQLのデータソース設定にも 追加したらMySQL Connector/J でも文字化けすることなく書き込むことができた。
結論
読み込み時も文字化けしたらもっと早くJDBCドライバ側に目を向けたと思うんだけど、以前、MySQL Connector/J 8.0.22を使ったら server time zone のエラーが発生してハマったことがあって(接続文字列に serverTimezone=JST を入れて解決)、さらに 8.0.23以降は 日付形式が変更されたことによってMySQLから取得したdatetime型のデータをdateFormat()でフォーマット形式を指定するとエラーが発生する(https://tracker.adobe.com/#/view/CF-4211276)こともあって5.1.49にした。なので、JDBCドライバ側に問題はないでしょって思ってしまったのが今回のハマった原因でした。
追記
せっかくなので、MySQL Connector/J 8.0.23 と 8.0.29でも文字化けしないか試してみた。そうしたら、8.0.23では5.1.49と同じでデータを書き込んだ時に文字が?????になってしまったが、8.0.29では文字化けは発生しなかった。ということは、8.0.24~8.0.29のどこかで(8.0.29あたりで変更が入っているみたいだけど)この問題を解消する変更が入ったってことだけど今回はこれ以上は深追いしない。8.0.23以降で日付形式が変更された件の影響は8.0.29でも同じだった。