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つ指定されているはずです。

これは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に設定これで、文字化けが解消しました!
おつかれさまでしたー。