DockerのMySQLでError 1366が出た時の対処法

雑記

開発環境をMAMPからDockerに変えてWeb開発やってたところ、MySQLでError 1366が出てツマヅイたのでメモ。

筆者はDockerのコマンドを覚えていないのでdocker-compose使ってます。
内容もdocker-composeを使っている前提で書いていきます。

DockerのMySQLでError 1366が出た時に確認するところ

まずはターミナルとかでMySQLにLoginする。

# mysql -u root -p

-uの後ろの’root’は各環境のユーザー名に置き換えてください。

↑のコマンドを実行するとパスワードを聞かれるので入力してログイン。

その後

mysql> status

を実行してサーバーの環境を確認する。

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

えーとも
えーとも

筆者の環境ではlatin1になってました。

ここまで確認したらひとまず’docker-compose down’で起動中のコンテナを終了&Removeします。

【補足】Dockerのコンテナに対してコマンドを実行する方法

Visual Studio Codeを使っていて、拡張機能のDockerを入れている場合は

  1. 一番左のアイコン一覧からDockerのクジラアイコンを選択
  2. Containersから現在使用しているmysqlのコンテナを右クリック
  3. 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イメージでは/etc/mysql/conf.d配下にある*.cnfを全て読み込むようになっています。

Docker × MySQL – Qiita より引用

とのことなので、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を利用している場合は

  1. ログインする
  2. 対象のDBをクリック
  3. 「操作」をクリック
  4. 右カラムの最下部にある「照合順序」を「utf8_general_ci」に変更
  5. ドロップダウンリストの下にある「Change all tables collations」にチェックを入れる
  6. 「実行」をクリック

の流れで変更できます。

えーとも
えーとも

コレ忘れると日本語データが登録できないのでご注意

実際に日本語データを入れてみる

最後に対象となるテーブルに日本語データを入れて動作確認してみましょう。
無事に登録されれば作業完了です。

えーとも
えーとも

お疲れ様でしたー!

各ファイルのサンプル

筆者がWeb開発の際に現在使っているファイルが↓です。
コンテナ名とか書き換えていますが、おおむねこんな感じ。

一応補足。
  1. docker-compose.yml :22のphp:customは自分でBuildしたimageです
  2. docker-compose.yml :29は.htaccessのmod_rewriteを使いたいので追加してます。
フォルダ構成は↓の通り。

参考にさせてもらいました

コメント