DockerのMySQLをよく使っているのだが、初期データで日本語を投入したときに文字化けする問題に悩まされている。
mysqldの実行時に下記のオプションを付与しても文字化け問題は解消せず。
--character-set-server=utf8
--collation-server=utf8_unicode_ci
今迄は、必要に応じて以下のように /etc/mysql/conf.d/charset.cnf
ファイルに文字コードの設定を追加して対処していたが、毎回Dockerfileを用意しなければいけないのが面倒だった。
1
2
3
4
5
6
7
8
9
FROM mysql:5.6
RUN { \
echo '[mysqld]'; \
echo 'character-set-server=utf8'; \
echo 'collation-server=utf8_general_ci'; \
echo '[client]'; \
echo 'default-character-set=utf8'; \
} > /etc/mysql/conf.d/charset.cnf
解決策
日本語の値を入れるSQL文を実行する前に、以下のオプションを適切に設定すれば良い。
- CHARACTER_SET_CLIENT
- CHARACTER_SET_CONNECTION
例
1
2
3
4
5
6
use <データベース名>;
SET CHARACTER_SET_CLIENT = utf8;
SET CHARACTER_SET_CONNECTION = utf8;
INSERT INTO ... <日本語が入った文字列> ...;
以下、あまり宜しくない暫定的な解決方法(過去の記事を一応残しておく)
今回またこの問題に遭遇し、ちょっと調べてみたところ、
- mysqlコンテナに入ってmysqlクライアントを立ち上げて確認すると日本語が文字化けしていない。
- dockerホスト側で確認すると文字化けしている。
という現象であることに気付いた。
client側の問題なのか?と思い --skip-character-set-client-handshake
オプションを実行時に付与したところ文字化けしなくなった。
docker起動時に指定できるオプションは以下で確認できる。
1
$ docker run -it --rm mysql:5.6 --verbose --help
docker-compose.ymlだと以下のように指定すればOK。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
version: '3'
services:
mysql:
container_name: mysql-db
image: mysql:5.6
ports:
- '3306:3306'
environment:
MYSQL_ROOT_PASSWORD: password
volumes:
- db_data:/var/lib/mysql
- ./db_init:/docker-entrypoint-initdb.d
command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci --skip-character-set-client-handshake
volumes:
db_data:
--skip-character-set-client-handshake
オプションは利用したくないので、本質的な解決ではないが開発環境で利用するだけであれば使える場面もあるかもしれない。
ただ、きちんとした対応をするのであれば、Dockerfileを用意して設定ファイルを変更する方法で対応した方が良い。この件は、今後ももう少し調べておきたい。