症状
コンソールからテーブルに、日本語を含んだレコードを追加すると文字化けしてしまう。
たとえば以下のようなデータを持つテーブルがあるとする。
1 2 3 4 5 6 7 |
+--------+------+ | name | age | +--------+------+ | John | 38 | | Alex | 40 | | 山田 | 50 | +--------+------+ |
これをそのままSELECT
コマンドで表示させると、以下のように文字化け。
1 2 3 4 5 6 7 8 9 10 11 |
mysql> select * from test; +------+------+ | name | age | +------+------+ | John | 38 | | Alex | 40 | | | 50 | +------+------+ 3 rows in set (0.00 sec) mysql> |
WHERE句で無理矢理元の文字列’山田’で探そうとすると、以下のようなエラーが出る。
1 |
ERROR 1267 (HY000): Illegal mix of collations (utf8_general_ci,IMPLICIT) and (ujis_japanese_ci,COERCIBLE) for operation '=' |
これはその文字列は存在しているがコードが違うと言われているようだ。
そこでMySQLのcharacter_set群がどのように設定されているかを確認。確認コマンドは以下の形式。
1 |
SHOW VARIABLES LIKE 'character_set%'; |
以下、実行結果。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
mysql> show variables like 'character_set%'; +--------------------------+----------------------------------+ | Variable_name | Value | +--------------------------+----------------------------------+ | character_set_client | ujis | | character_set_connection | ujis | | character_set_database | ujis | | character_set_filesystem | binary | | character_set_results | ujis | | character_set_server | ujis | | character_set_system | utf8 | | character_sets_dir | /usr/local/share/mysql/charsets/ | +--------------------------+----------------------------------+ 8 rows in set (0.01 sec) mysql> |
さくらレンタルサーバでDBを追加する際の文字コード指定はUTF-8としていて、ターミナル側の設定はUTF-8だが、ほとんどがujis = EUC_jpになっている。
対策
MySQLにログインした後、一度だけ以下を実行する。
1 |
CHARSET utf8; |
以下、実行例。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
mysql> charset utf8 Charset changed mysql> select * from test; +--------+------+ | name | age | +--------+------+ | John | 38 | | Alex | 40 | | 山田 | 50 | +--------+------+ 3 rows in set (0.00 sec) 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 | ujis | | character_set_system | utf8 | | character_sets_dir | /usr/local/share/mysql/charsets/ | +--------------------------+----------------------------------+ 8 rows in set (0.00 sec) mysql> |
適切に表示され、chracter_set
変数群も_server
を除いて全てUTF-8になっている。
なお、SET CHARSET utf8
での文字コード設定を説明しているサイトが殆どだが、この方法だと文字化けはなくなるが、カラム幅が崩れてしまう。この時のcharacter_setの設定値は上と同じに変更されるが表示のされ方が違う。
対策・改
その後、MySQLに入る時に以下を実行する方法も知った。--default-character-set=utf8mb4
を指定する。
1 |
% mysql --host=mysql57.taustation.sakura.ne.jp --user=taustation --password --default-character-set=utf8mb4 |
この結果文字コードは以下のようになって、文字化けも解消。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
mysql> show variables like 'char%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | 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 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec) |
20210604