🐬

MySQL コンテナ上の MySQL Client が日本語対応していない場合の解決策

2024/08/23に公開

はじめに

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