🐬
MySQL コンテナ上の MySQL Client が日本語対応していない場合の解決策
はじめに
MySQL コンテナ上の MySQL Client が日本語対応していない場合に、日本語が入力できません。
例えば、以下の設定で MySQL コンテナを起動します。
compose.yaml
services:
db:
image: mysql:8.0
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: yes
MYSQL_ROOT_HOST: "%"
volumes:
- ./db/mysql:/etc/mysql/conf.d
- db-data:/var/lib/mysql
ports:
- "3306:3306"
volumes:
db-data:
db/mysql/my.cnf
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_bin
[mysql]
default-character-set=utf8mb4
[client]
default-character-set=utf8mb4
MySQL コンテナにアクセスして DB を作成します。
$ docker compose up -d
$ docker compose exec db mysql -uroot
mysql> CREATE DATABASE sample;
mysql> use sample
mysql> CREATE TABLE `users` (`id` BIGINT NOT NULL AUTO_INCREMENT, `name` VARCHAR(255), PRIMARY KEY (`id`));
日本語が入力されたクエリをコンソールにペーストすると日本語が消えてしまいます。
INSERT INTO `users` (`name`) VALUES ('佐藤');
以下のようになります。
mysql> INSERT INTO `users` (`name`) VALUES ('');
解決策
ローカル側の MySQL Client を使います。
$ sudo apt install -y mysql-client
$ mysql --version
mysql Ver 8.0.39-0ubuntu0.22.04.1 for Linux on x86_64 ((Ubuntu))
MySQL コンテナを起動した状態で、ローカル側の MySQL Client からアクセスすると日本語が入力できるようになります。
$ mysql -h 0.0.0.0 -P 3306 -uroot -D sample;
mysql> INSERT INTO `users` (`name`) VALUES ('佐藤');
mysql> SELECT * FROM `users`;
+----+--------+
| id | name |
+----+--------+
| 1 | |
| 2 | 佐藤 |
+----+--------+
2 rows in set (0.01 sec)
おわりに
MySQL の Docker Image をカスタマイズして日本語に対応する方法もありますが、日本語対応済みのローカル側からアクセスするほうが手軽に解決できます。
Discussion