読者です 読者をやめる 読者になる 読者になる

リア充爆発日記

You don't even know what ria-ju really is.

日本人ならRDSを使う際にかならずやらなければならないこと

「日本人なら」って言っても別に落ちないようにお祓いをするとかそういうことじゃあない。
文字コードの設定の話です。

ふつうにRDS(MySQL)たちあげてRailsアプリとつなげて日本語入力したらぜんぶ"???"になったっていう。show table statusしたらテーブルの文字コードはぜんぶlatin1_swedish_ciになっててshow variables like 'char%';的にはこんな感じになってた。

| character_set_client     | utf8                                      |
| character_set_connection | utf8                                      |
| character_set_database   | latin1                                    |
| character_set_filesystem | binary                                    |
| character_set_results    | utf8                                      |
| character_set_server     | latin1                                    |
| character_set_system     | utf8                                      |


このへんの設定をいじくるには"DB Parameter Groups"を使う
http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_WorkingWithParamGroups.html

今回はAWS Management ConsoleでDBの文字コードをutf8mb4にする設定手順を確認していく。

DB Parameter Groups概要

ざっと要約すると

  • "DB Parameter Groups"は言ってみれば設定のコンテナ。個別のDBインスタンスに適用することによって反映される。
  • DBインスタンス作成時にDB Parameter Groupsを指定しなければ、デフォルトのDB Parameter Groupsが適用される
    • デフォルトのDB Parameter GroupsはDBエンジン、インスタンスタイプ、ストレージ容量を元に設定される
  • 自分で"DB Parameter Groups"を設定したかったら新規にDB parameter groupを作って、それをDBインスタンスに適用すればよい
    • DB parameter groupを変更すれば、それが適用されているすべてのインスタンスに変更が反映される
    • すでに稼働しているDBに反映させるにはRebootが必要
  • 設定がアレだと、インスタンスが落ちたり、パフォーマンスが落ちたりするので注意

DB Parameter Groupの作成

AWS Management ConsoleからRDS設定画面に行くと、ナビに"DB Parameter Groups"があるのでそこから作る。
ちなみにここでデフォルトの設定内容が確認でき、たとえばinnodb_buffer_pool_sizeは{DBInstanceClassMemory*3/4}という基準で設定されていることがわかったりする。このデフォルトのパラメータをいじることもできるけど、怖いからやらない。

  1. 「Create DB Parameter Group」ボタンおす
    • DB Parameter Group Family: mysql5.5を選択
    • DB Parameter Group Name: テキトウに入れる(utf8mb4 と入れた)
    • DB Parameter Group Description:テキトウに入れる(modify charset to utf8mb4 と入れた)
  2. 「Yes create」ボタンおす
  3. 一覧に戻るので今作った"utf8mb4"を選択して「Edit parameter」ボタンを押す
  4. 以下の項目のカラムに"utf8mb4"と入力
    • character_set_database
    • character_set_client
    • character_set_connection
    • character_set_results
    • character_set_server
  5. 「Save changes」ボタンをおす

DB Parameter Groupの適用

さっき作ったDB parameter groupをインスタンスに適用する。今回はすでに稼働しているインスタンスを対象にする。さっきも書いたけどリブート入るんでそこんとこ夜露死苦

  1. ナビから"Instances"選択
  2. DB parameter groupを適用するインスタンスを選択し、「Instance Actions」プルダウンから「Modify」を選択
  3. Parameter Groupをさっき作った"utf8mb4"に変更
    • すぐリブートしていいときはApply Immediatelyにチェックを入れる
  4. 「Continue」→「Modify DB Instance」

これで完了

反映の確認

リブート完了を待って再びshow variables like 'char%';

| character_set_client     | utf8                                      |
| character_set_connection | utf8                                      |
| character_set_database   | latin1                                    |
| character_set_filesystem | binary                                    |
| character_set_results    | utf8                                      |
| character_set_server     | utf8mb4                                   |
| character_set_system     | utf8                                      |

・・・あれ。なにこの微妙に変わってない感じ。

色々調べた結果、以下のパラメータを1に設定することが必要

  • skip-character-set-client-handshake

再度リブート完了を待って再びshow variables like 'char%';

| character_set_client     | utf8mb4                                      |
| character_set_connection | utf8mb4                                      |
| character_set_database   | latin1                                    |
| character_set_filesystem | binary                                    |
| character_set_results    | utf8mb4                                      |
| character_set_server     | utf8mb4                                   |
| character_set_system     | utf8                                      |

character_set_databaseだけ変わらない。
これはもうコマンドラインでやってやった。

alter database mydb character set utf8mb4 collate utf8mb4_general_ci;
| character_set_client     | utf8mb4                                   |
| character_set_connection | utf8mb4                                   |
| character_set_database   | utf8mb4                                   |
| character_set_filesystem | binary                                    |
| character_set_results    | utf8mb4                                   |
| character_set_server     | utf8mb4                                   |
| character_set_system     | utf8                                      |

ちなみに、show variables like 'char%';はセッション単位なので別のセッションで設定変更をさせた場合、確認するにはshow global variablesにしないとイケないことに注意。

が、ここまでやってもクライアント(MySQLクライアント、Railsアプリの両方)からの入力が文字化ける・・・。なぜだ・・・。
utf8mb4じゃなくて、utf8にしてみたら文字化けは解消されたのだが・・・。

いろいろ試しながらやってしまってどこかおかしなことをやっちまっていたのかもしれないので、デフォルトに戻して再度手順を追ってみた。ら、文字化けが解消した。

よくあるよねーこういうこと。