質問: Eclipseで取ってきたデータベースの日本語が文字化けします。 データベースはMySQLを使用しており、.cnfというファイルも見つからず、unicodeを追加しても何ら変わりはありません。 どうしたらよろしいでしょうか?
回答: 修正依頼のコメントで下記のように文字コードがセットされているということを教えていただきました。 MySQLのUTF-8は下記を見てわかるように現状、2種類の文字コードが混在しています。 MySQLのマニュアルを見て頂くとわかると思いますが、`utf8`と`utf8mb4`では文字コードの取り扱い方が異なっていますので、文字コードを揃えなければいけません。 > > *※ 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()`で文字コードを調べることができます。 ``` mysql> SELECT SUBSTR(SUBカラム名, 0, 1), HEX(SUBSTR(SUBカラム名, 0, 1)) FROM テーブル名 ``` DB再構築が可能であれば、文字コードを揃えてテーブルを作り直すと文字化けしません。 #### utf8からutf8mb4へ文字コード変換方法 DBを再構築することが難しければ、けっこう面倒ですが変換することも可能です。 InnoDBのフォーマットを初期設定の`Antelope`から`Barracuda`にしたい場合は下記のサイトが参考になります。 基本的な文字コードの変更方法は下記のようになります。 1. 設定ファイルで文字コードを設定 2. MySQLサーバー再起動 3. テーブルの文字コードを変更 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を実行して変換します。 ``` #書式 ALTER TABLE テーブル名 MODIFY カラム名 型 character set utf8mb4; #例 ALTER TABLE test_tbl MODIFY column1 VARCHAR(16) character set utf8mb4, MODIFY column2 INT character set utf8mb4; ``` 下記はテーブルの**初期文字コード**を`utf8mb4`に変更します。 ``` ALTER TABLE テーブル名 DEFAULT character set utf8mb4 COLLATE utf8mb4_general_ci; ```