2013年08月27日

[Web] AWSを使ってみる CRDSでの文字化けに対処してみた

PHPからRDSに接続してSQLを発行できたことだし、あとはアプリづくりに専念できる!
と思いきや、日本語をテーブルに挿入してみたら「???」と表示されてしまいました orz

これが、これまでで一番ハマった問題でした。

「UTF-8で日本語を表示したい」
これが今回の目的です。

まずは、「SET NAMES」というコマンドが有効っぽいと出てきたけど問題があるっぽい。

【参考】mysql + PHP の SET NAMES問題

ならば、「PDO::MYSQL_ATTR_INIT_COMMAND => "SET CHARACTER SET `utf8`"」という命令がよさげ。
でもダメでした。

【参考】PHP, PDOでMySQL接続時の文字コード設定

次に、「charset=utf8」を設定すればよいという情報を発見。
指定しても変わらず……。

【参考】
PDO_MYSQL DSN
PHP 5.3.6以降(PDO)でMYSQLの文字化け対策(charsetを指定する)

EC2の /etc/my.cnf に設定を追記(↓)すればいけるという記事を見つけるもダメでした。
※現在もこの記述は残していますが
=======================================
[mysqld]
default-character-set = utf8

[mysqld_safe]
character-set-server = utf8

[mysql]
default-character-set = utf8

[mysqldump]
default-character-set = utf8
=======================================

EC2の設定を確認してみようという記事を発見。

mysql> show variables like 'character_set%';
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| 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 |
| character_sets_dir | /rdsdbbin/mysql-5.6.12.R1/share/charsets/ |
+--------------------------+-------------------------------------------+

UTF8以外の文字コードに設定されていることが確認できました。
でもこの参考サイトでの対処方法は「SET NAMES」という非推奨の方法。

【参考】PDOでmysqlに接続する時の文字コード
【参考】MySQLに日本語でINSERTできない場合

解決方法を探していたら、「RDSのパラメーターグループを変更」する必要があるらしい。

【参考】Amazon RDSのパラメータグループを変更する方法

パラメーターグループを変更するには、「Amazon RDS Command Line Toolkit」を使う必要があるらしい。
しかもJAVA環境が入っている必要もあるらしい。

くじけそうになりました orz

ということで、参考サイトを見ながらMacに Amazon RDS Command Line Toolkit をインストール。
幸い、JAVA環境はインストール済みでした。

環境設定(~/.bashrc )に以下を追加。
=======================================
# JAVAの環境設定
JAVA_HOME=/System/Library/Frameworks/JavaVM.framework/Versions/CurrentJDK/Home
export JAVA_HOME
PATH=$PATH:$JAVA_HOME/bin

# Amaozn Web Service Setting
export AWS_CREDENTIAL_FILE=/Users/[Macのユーザー名]/aws/credential.txt ←具体的には以下のとおり

# Amazon RDS CLT Setting
export AWS_RDS_HOME=/Users/[Macのユーザー名]/aws/RDSCli-1.14.001 ← ToolKitを解凍した場所
PATH=$PATH:$AWS_RDS_HOME/bin
=======================================

「credential.txt」は、参考サイトにあった「アクセス証明書」にあった、
アクセスキーIDとシークレットキーの2つを記載して保存しました↓

=======================================
# Enter the AWS Keys without the < or >
# These can be found at http://aws.amazon.com under Account->Security Credentials
AWSAccessKeyId=[アクセスキーID]
AWSSecretKey=[シークレットキー]
※権限は 600
=======================================

ToolKitのインストールが出来たら、
次はAWSの管理画面に入り、RDSの設定変更のところで「Parameter Group」を追加します。

RDSの画面の左メニュに「Parameter Groups」があるので、それをクリックすると
現在のParameter Groupが表示されます。
デフォルトで1つ指定されているはずです。

スクリーンショット 2013-08-27 0.34.07.png

これはToolKitでは変更できないようで、
新しくParameter Groupを作りUTF8設定をして、それをRDSに適用する
方法で解決しました。

Parameter Groupを新規に作る方法は、上記のAWS管理画面の指示どおりにすれば簡単にできました。

■注意点
作成ウィザードを進めていくと「DB Parameter Group Family:」を選択する画面になります。
そのときは、使用しているRDSのインスタンスと同じMySQLのバージョンを指定してください
そうすることで、RDSのインスタンス > 右クリック > Modify > で表示される管理画面にて
「Parameter Group:」の選択肢に上記で作成した Parameter Group が選択できるようになります。
※異なったバージョンのMySQLを指定すると、選択肢に表示されません

これで準備が整いました(長い。。。


いよいよ、Amazon RDS Command Line Toolkit を使ってParameter Groupを変更します。
Macでコンソールを立ち上げて、ToolKitを実行しました。

実際に使ったコマンド↓
=======================================
rds-modify-db-parameter-group [ParameterGroup名] \
--aws-credential-file $AWS_CREDENTIAL_FILE \     ←~/.bashrc で設定した「AWS_CREDENTIAL_FILE」
--region ap-northeast-1 \               ←AZのインスタンスに合わせる
--parameters "name=character_set_client, value=utf8, method=immediate"

rds-modify-db-parameter-group [ParameterGroup名] \
--aws-credential-file $AWS_CREDENTIAL_FILE \
--region ap-northeast-1 \
--parameters "name=character_set_connection, value=utf8, method=immediate"

rds-modify-db-parameter-group [ParameterGroup名] \
--aws-credential-file $AWS_CREDENTIAL_FILE \
--region ap-northeast-1 \
--parameters "name=character_set_database, value=utf8, method=immediate"

rds-modify-db-parameter-group [ParameterGroup名] \
--aws-credential-file $AWS_CREDENTIAL_FILE \
--region ap-northeast-1 \
--parameters "name=character_set_results, value=utf8, method=immediate"

rds-modify-db-parameter-group [ParameterGroup名] \
--aws-credential-file $AWS_CREDENTIAL_FILE \
--region ap-northeast-1 \
--parameters "name=character_set_server, value=utf8, method=immediate"
=======================================

この後、RDSの該当するインスタンスを 右クリック > Reboot して再起動します。
Parameter Groupを確認して、以下のようになっていれば成功です!

振り返ると、MySQLのコマンドの先頭に「--default-character-set=utf8」を付けてます。
これも文字化け対策でした↓

$ mysql --default-character-set=utf8 -h [Endpoint] -P 3306 -u [RDSのインスタンスのユーザー名] -p

mysql> show variables like 'character_set%';
+--------------------------+-------------------------------------------+
| Variable_name | Value |
+--------------------------+-------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /rdsdbbin/mysql-5.6.12.R1/share/charsets/ |
+--------------------------+-------------------------------------------+

【参考】
AWSのRDSの文字化けに悩んだ時にパラメーター設定の為に見たサイトまとめ
AWS RDS パラメータグループでMySQLの文字コードをUTF-8に設定

これで、文字化けが解消しました!
おつかれさまでしたー。
posted by be-style at 01:09| Comment(0) | Web
この記事へのコメント
コメントを書く
お名前:

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

※ブログオーナーが承認したコメントのみ表示されます。