Docker MySQLでの文字化け対策
2017/09/05
IT dockermysql

DockerのMySQLをよく使っているのだが、初期データで日本語を投入したときに文字化けする問題に悩まされている。

mysqldの実行時に下記のオプションを付与しても文字化け問題は解消せず。

今迄は、必要に応じて以下のように /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文を実行する前に、以下のオプションを適切に設定すれば良い。

1
2
3
4
5
6
use <データベース名>;

SET CHARACTER_SET_CLIENT = utf8;
SET CHARACTER_SET_CONNECTION = utf8;

INSERT INTO ... <日本語が入った文字列> ...;

以下、あまり宜しくない暫定的な解決方法(過去の記事を一応残しておく)

今回またこの問題に遭遇し、ちょっと調べてみたところ、

という現象であることに気付いた。

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を用意して設定ファイルを変更する方法で対応した方が良い。この件は、今後ももう少し調べておきたい。