開発環境をMAMPからDockerに変えてWeb開発やってたところ、MySQLでError 1366が出てツマヅイたのでメモ。
DockerのMySQLでError 1366が出た時に確認するところ
まずはターミナルとかでMySQLにLoginする。
# mysql -u root -p
↑のコマンドを実行するとパスワードを聞かれるので入力してログイン。
その後
mysql> status
を実行してサーバーの環境を確認する。

赤枠で囲っている部分の「utf8」が別の値になっていたらMySQLにcnfの追加読み込みが必要。

筆者の環境ではlatin1になってました。
ここまで確認したらひとまず’docker-compose down’で起動中のコンテナを終了&Removeします。
【補足】Dockerのコンテナに対してコマンドを実行する方法

Visual Studio Codeを使っていて、拡張機能のDockerを入れている場合は
- 一番左のアイコン一覧からDockerのクジラアイコンを選択
- Containersから現在使用しているmysqlのコンテナを右クリック
- Attach Shellを選択
ってするとエディタの下に表示されるターミナルから操作ができる。

GUIでコンテナの再スタートとかもできて便利なので入れておくといいかも。
DockerのMySQLで追加のcnf(設定)ファイルを読み込む
まずはMySQLで扱うエンコードをutf8にするために↓のようなファイルを準備します。
筆者はてきとーにcustom.cnfって名前にしました。
[client] default-character-set=utf8 [mysql] default-character-set=utf8 [mysqldump] default-character-set=utf8 [mysqld] character-set-server=utf8
MAMPとかXAMPPだったら実ファイルがPC内にあるのでサクッとそれっぽいフォルダにファイルを追加すれば済むんだけど、そうはいかないのがDockerのちょっと難しい(と個人的に感じる)ところ。
先ほど作成したcustom.cnfをDockerに読み込ませるために、docker-compose.ymlへ追記する必要があります。
問題はコンテナから見てどのフォルダに読み込ませる必要があるのか。
Qiitaに載っている情報によると
Mysql公式のDockerイメージでは
Docker × MySQL – Qiita より引用/etc/mysql/conf.d
配下にある*.cnf
を全て読み込むようになっています。
とのことなので、docker-compose.ymlのmysqlコンテナのvolumesに下記の内容を追加。
- ./mysql-config:/etc/mysql/conf.d
‘./mysql-config’は任意のフォルダ名に変更可能。
指定したフォルダの中に先ほど用意したcnfファイルを入れておきます。
docker-compose.ymlを上書きしたら’docker-compose up -d’で立ち上げて動作確認。

赤枠部分がutf8になっていればcnfを読み込めています。
作成済みDBの照合順序を変更する
cnfを読み込んでサーバーがマルチバイト対応していても作成済みのDB、テーブルの照合順序がマルチバイト非対応の状態なので照合順序を変更します。
phpmyadminを利用している場合は
- ログインする
- 対象のDBをクリック
- 「操作」をクリック
- 右カラムの最下部にある「照合順序」を「utf8_general_ci」に変更
- ドロップダウンリストの下にある「Change all tables collations」にチェックを入れる
- 「実行」をクリック
の流れで変更できます。

コレ忘れると日本語データが登録できないのでご注意
実際に日本語データを入れてみる
最後に対象となるテーブルに日本語データを入れて動作確認してみましょう。
無事に登録されれば作業完了です。

お疲れ様でしたー!
各ファイルのサンプル
筆者がWeb開発の際に現在使っているファイルが↓です。
コンテナ名とか書き換えていますが、おおむねこんな感じ。
- docker-compose.yml :22のphp:customは自分でBuildしたimageです
- docker-compose.yml :29は.htaccessのmod_rewriteを使いたいので追加してます。

コメント