修正依頼のコメントで下記のように文字コードがセットされているということを教えていただきました。
MySQLのUTF-8は下記を見てわかるように現状、2種類の文字コードが混在しています。
MySQLのマニュアルを見て頂くとわかると思いますが、utf8
とutf8mb4
では文字コードの取り扱い方が異なっていますので、文字コードを揃えなければいけません。
https://dev.mysql.com/doc/refman/5.6/ja/charset-unicode-utf8mb4.html
※ MySQLマニュアルより
utf8 という名前の文字セットは、文字あたり最大 3 バイトを使用し、BMP 文字だけを含みます。utf8mb4 文字セットは、文字ごとに最大 4 バイトを使用し、補助文字をサポートします。
character_set_client utf8mb4
character_set_connection utf8
character_set_database utf8
character_set_filesystem binary
character_set_results utf8mb4
character_set_server utf8
character_set_system utf8
文字化けしている場所をHEX()
を使ってSELECTしてみるとわかりやすいかもしれません。
SUBSTR()
で1文字切り出した文字が「?」になっているとして、これをHEX()
で文字コードを調べることができます。
sql
1mysql> SELECT SUBSTR(SUBカラム名, 0, 1), HEX(SUBSTR(SUBカラム名, 0, 1)) FROM テーブル名
DB再構築が可能であれば、文字コードを揃えてテーブルを作り直すと文字化けしません。
utf8からutf8mb4へ文字コード変換方法
DBを再構築することが難しければ、けっこう面倒ですが変換することも可能です。
InnoDBのフォーマットを初期設定のAntelope
からBarracuda
にしたい場合は下記のサイトが参考になります。
http://qiita.com/kenjiszk/items/56f0fa58fba84b686401
http://qiita.com/hatappi/items/132f56c00e428beef777
基本的な文字コードの変更方法は下記のようになります。
- 設定ファイルで文字コードを設定
- MySQLサーバー再起動
- テーブルの文字コードを変更
MySQLの設定ファイルmy.cnf
を探します。ない場合は作成します。
MySQLのデーターベースバイナリログファイルの置き場所が/var/lib/mysql
だとすると、このディレクトリに/var/lib/mysql/my.cnf
のように作成します。
既に設定ファイルがある場合は、[mysqld]の下に追記して、[client]も同様に追記します。
[mysqld]
character-set-server=utf8mb4 #これが追記する設定
[client]
default-character-set=utf8mb4 #これが追記する設定
my.cnf
を変更または、作成保存したらMySQLを再起動します。
そして、コマンドラインで下記SQLを実行して変換します。
sql
1#書式
2ALTER TABLE テーブル名 MODIFY カラム名 型 character set utf8mb4;
3
4#例
5ALTER TABLE test_tbl MODIFY column1 VARCHAR(16) character set utf8mb4, MODIFY column2 INT character set utf8mb4;
下記はテーブルの初期文字コードをutf8mb4
に変更します。
sql
1ALTER TABLE テーブル名 DEFAULT character set utf8mb4 COLLATE utf8mb4_general_ci;