MySQLが文字化けした際の対応【小ネタ】

MySQLコマンドを使ってMySQLに接続した際に文字化けしていることが稀にあると思いますが、そのような時の対応をあげておきます。

事象としてはこんな感じです。

mysql> select * from users;
+-----+--------------------+---------------------+---------------------+------------+
| id  | name               | created_at          | updated_at          | deleted_at |
+-----+--------------------+---------------------+---------------------+------------+
|   1 | ???????            | 2021-07-19 15:03:57 | 2021-07-19 15:03:57 | NULL       |
|   2 | ????               | 2021-07-19 15:03:57 | 2021-07-19 15:03:57 | NULL       |
|   3 | ???????            | 2021-07-19 15:03:57 | 2021-07-19 15:03:57 | NULL       |
|   4 | ???????            | 2021-07-19 15:03:58 | 2021-07-19 15:03:58 | NULL       |
|   5 | ??                 | 2021-07-19 15:03:58 | 2021-07-19 15:03:58 | NULL       |

まずはMySQLの文字コード関連がどのようになっているか確認します。

mysql> show variables like 'character%';
+--------------------------+------------------------------------------------------------------+
| Variable_name            | Value                                                            |
+--------------------------+------------------------------------------------------------------+
| character_set_client     | latin1                                                           |
| character_set_connection | latin1                                                           |
| character_set_database   | utf8mb4                                                          |
| character_set_filesystem | utf8mb4                                                          |
| character_set_results    | latin1                                                           |
| character_set_server     | utf8mb4                                                          |
| character_set_system     | utf8                                                             |
+--------------------------+------------------------------------------------------------------+
7 rows in set (0.00 sec)

今回は一部の設定(クライアント側の文字コード)がlatin1になっていることが原因でした。

取り急ぎクライアント側の文字コードを変更したい場合は以下で実現可能です。

mysql> SET NAMES utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> show variables like 'character%';
+--------------------------+------------------------------------------------------------------+
| Variable_name            | Value                                                            |
+--------------------------+------------------------------------------------------------------+
| character_set_client     | utf8                                                             |
| character_set_connection | utf8                                                             |
| character_set_database   | utf8mb4                                                          |
| character_set_filesystem | utf8mb4                                                          |
| character_set_results    | utf8                                                             |
| character_set_server     | utf8mb4                                                          |
| character_set_system     | utf8                                                             |
+--------------------------+------------------------------------------------------------------+
7 rows in set (0.00 sec)

その結果、無事に文字化けは解消されました!