【Aurora MySQL】文字列型カラムの日本語が文字化けする問題の解消【令和最新版】
おはようございます、ねすたです、よろしくどうぞお願いします。
今回はAurora MySQLについてです。
最近日本語の値が入ることを想定したカラムを追加したのですが、あるデータ連携を試みると文字化けしてて困りました。
「んなのエンコードをUTF-8に変更すれば終わるだろ」と思っていた時期が私にもありました。
いや、確かにそうなんです。しかしゴールはエンコードの変更なのですが、Aurora MySQLの場合は設定が多岐に渡るので今後のためにも記載しておきます。
0.現状を把握
対象のAurora MySQLのクラスタに接続します。
そして以下のコマンドでエンコード設定状況を確認します。
show variables like '%char%';
結果はこちら。特に何も設定せずにAurora MySQLを立ち上げるとこうなるはずです。
今回変更したいパラメータは、
character_set_database
character_set_server
この2つで、特にcharacter_set_databaseはかなり強キャラでした。(後述)
1.MySQL内の文字コード設定を変更
一番シンプルな方法です。Auroraでなければこの方法で問題ないはず。
set character_set_database = utf8;
set character_set_server = utf8;
設定後、確認すると、
ちゃんと変更できているように見えます。
見えます。
再接続して確認すると「latin1」に戻っているケースがあります。
(戻っていなければこれで設定完了です、お疲れさまでした。)
2.クラスタパラメータグループの設定変更
1の方法だと、ログインの度に設定変更しないといけないので実用的ではありません。
Aurora側の設定で元からエンコードを見直さないといけないようなので、設定していきます。
■クラスタパラメータグループの作成
Aurora MySQLで必要なパラメータを設定できるクラスタパラメータグループを作成します。
RDSコンソールから、「パラメータグループ」タブを押下し、「パラメータグループの作成」ボタンを押下します。
・パラメータグループファミリー:(紐付けたいクラスタのバージョン等に合わせる)
・グループ名(タイプ):「DB Cluster Parameter Group」
・グループ名(識別子):(任意)
・説明:(任意)
適宜入力後、「作成」ボタンを押下すると、クラスタパラメータグループの作成が完了する。
■エンコード関連のパラメータを変更
作成したクラスタパラメータグループの設定内容を開き、パラメータ項目の検索窓に以下のパラメータを指定しながら値を確認・変更していく。
・character_set_client:utf8 or utf8mb4
・character_set_connection:utf8 or utf8mb4
・character_set_database:utf8 or utf8mb4
・character_set_results:utf8 or utf8mb4
・character_set_server:utf8 or utf8mb4
★skip-character-set-client-handshake:1(←割と重要)
各種変更後、「続行」→「変更を適用」の順に押下してパラメータの変更を完了させます。
■クラスタにパラメータグループを紐付け
クラスタ新規作成時でも変更時でも構わないので、クラスタにパラメータグループを紐付ける。
(作成済のデータベースに紐付ける場合)
RDSコンソールから、「データベース」タブを押下し、データベース一覧から紐付けたいAurora MySQLクラスタのラジオボタンをONにして、ベージ上部の「変更」ボタンを押下する。
追加設定項目内にある「DBクラスタのパラメータグループ」項目に対して、作成したクラスタパラメータグループを選択し、ベージ下部の「続行」ボタンを押下する。
その後、変更のスケジューリング項目に対し「すぐに適用」をONにして、「クラスタの変更」ボタンを押下して変更は完了です。
以上の手順を実行することで、クラスタパラメータグループが紐付けられます。
本番環境のクラスタでなければ、念の為DBの再起動を行っておくとよいと思います。(エンコード系のパラメータは即時反映されるものなので必須ではないですが)
クラスタ新規作成時に紐付けた場合はおそらくこの時点でエンコードが正しく設定できているはずですが、変更時に紐付けた場合は既存のテーブルではエンコードできていないものもあるのではないかと思います。(今回ねすたはこのパターンだった)
3.それでも文字化けしてしまったら
ねすたがハマったパターンを時系列で書き起こすと、
①クラスタ・DBを作成
②対象クラスタのDBにテーブルを作成
③クラスタパラメータグループを作成
④クラスタパラメータグループをクラスタに紐付け
こんな感じだったと思います。原因を深堀りできていませんが、先にテーブルを作成すると既存テーブルには反映されないのではないかと思われます。(ねすたの場合はcharacter_set_databaseがlatin1になってしまっていた)
もし文字化けが続いているようであれば、以下の設定していきます。
クラスタパラメータグループ設定の反映先は
show global variables like 'character%';
上記のglobal設定に反映されているはずなので、一旦確認してみる。
※global付けないほうはセッション内での設定なので、Aurora MySQLだとあまり効果がなかったようでした。
クラスタパラメータグループの内容に沿っています。
※ここが変更できていなかったらRDSまわりの設定を見直してください。
続いて、先にDBの設定を行っていた場合にCREATE文のエンコード設定がlatin1のままになっている可能性が高いので確認する。
show create database `{DB名}`;
結果:
CREATE DATABASE `{DB名}` /*!40100 DEFAULT CHARACTER SET latin1 */
これだわ。
変更します。
ALTER DATABASE `{DB名}` default character set utf8;
再度確認した結果:
CREATE DATABASE `{DB名}` /*!40100 DEFAULT CHARACTER SET utf8 */
変更を確認できました。
データ連携をしてみると、無事に文字化けせずに日本語の値を格納することができました!
上記いずれかの設定をあーだこーだすればきっといけるはず。
こちらからは以上です。