はじめに
docker で立てたmysql serverを利用しようとしたところ、日本語が文字化けしたのですが、思っていたより日本語を対応させるのに苦戦し、適格な記事もなかったので備忘録
今回の現象
下記のsqlを実行
select * from work;
出力
+--------+-------------------+------+----------+--------------+
| workid | title | week | time | latestpartid |
+--------+-------------------+------+----------+--------------+
| 27259 | ????????????????? | ???? | 23:45:00 | 27259004 |
+--------+-------------------+------+----------+--------------+
完全に文字化けしてます。
本題(解決方法)
docker run
docker run をする時に、 MySQLサーバーのデフォルト文字セットをutf8mb4に設定する必要があります。
指定するオプション
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
訳) 多くの設定オプションをフラグとして mysqld に渡すことができる。 これにより、cnf ファイルを必要とせずにコンテナを柔軟にカスタマイズできるようになる。 たとえば、すべてのテーブルのデフォルトのエンコーディングと照合順序をUTF-8(utf8mb4)に変更したい場合は、以下を実行するだけでよい:詳しくは下記の公式ドキュメント参照
具体的な例
docker run -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password -d mysql/mysql-server --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
オプションは記者の場合のものなので、適宜カスタムしてください。
データベース,テーブルの文字コードを変更する
私の場合は、データベース、テーブルを作成後に以下のコマンドを実行し、うまく動きました。
ALTER DATABASE <データベース名> CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE <テーブル名> CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
SET NAMES utf8mb4;
結果
下記のsqlを実行
select * from work;
出力
+--------+---------------------------------+---------+----------+--------------+
| workid | title | week | time | latestpartid |
+--------+---------------------------------+---------+----------+--------------+
| 27259 | かつて魔法少女と悪は敵対していた。 | 木曜配信 | 23:45:00 | 27259004 |
+--------+---------------------------------+---------+----------+--------------+
ちゃんと出てくれました。良かった。
最後に
公式ドキュメントとchat-GPT君の共闘でなんとか解決しました。