MySQLでIncorrect string value: ‘XXX…’ for column ‘column’ at row 1 のエラー

dockerでmysql環境を作り、SQLにインサート処理をしようとしたら下記のエラーがでた。

Incorrect string value: '\xE3\x82\xBF\xE3\x82\xA4...' for column 'column' at row 1 

これは文字列が取り扱えなかったときに出力されるエラー
実際、インサート時に英字で入力するとちゃんと保存され、日本語を使用しようとするとエラーになっていた。

問題は文字コードにあるのでSQLに入って確かめる。

$ mysql -u root -p
$ mysql> show variables like "chara%";

文字コードがutf-8になっていたことを確認。
utf8においては絵文字や難しい漢字とかが使えない場合がある
そのため現状最も多様性があり、日本語が使用できそうなのはutf8mb4なのでこちらに変更を行う

解決方法には2パターンある

docker-compose.yml内でmysqlを実行しているservicesに下記のcommandを追加する

command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci

もしくはmysqlの設定ファイルを含める、そちらで文字コードを指定する方法

docker-compose.yml

   volumes:
     - "./mysql/data:/var/lib/mysql" # データの永続化
     - "./mysql/conf_d:/etc/mysql/conf.d" # 設定ファイル
     - "./mysql/mysql_init:/docker-entrypoint-initdb.d" # 初期実行

mysql/conf_d/my.cnf

[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
explicit_defaults_for_timestamp = true
[client]
default-character-set=utf8mb4

関連記事