要約
MySQL5.7で日本語データを入力すると以下のエラーが表示された。
1366: Incorrect string value: '\xE4...' for column 'question' at row 1
ぶつかった壁が2つあったのでまとめる。
- DB構築の壁(Dockerで構築している場合)
- テーブルの壁
前提
- M2 MacBook Air
- MySQL 5.7
- Docker Desktop使用
docker-composeでMySQL構築(説明サイトがたくさんありますので割愛)
1. DB構築の壁(Dockerで構築している場合)
my.cnfに日本語データ入力するための記述を記載してMySQLを再起動。(説明サイトがたくさんありますので割愛)
my.cnf
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_bin
[client]
default-character-set=utf8mb4
[mysql]
default-character-set=utf8mb4
[mysqldump]
default-character-set=utf8mb4
SHOW VARIABLES LIKE 'chara%';
を実行すると一部がlatinになっている。
Variable_name | Value |
---|---|
character_set_client | utf8mb4 |
character_set_connection | utf8mb4 |
character_set_database | latin1 |
character_set_filesystem | binary |
character_set_results | utf8mb4 |
character_set_server | latin1 |
character_set_system | utf8 |
character_sets_dir | /usr/share/mysql/charsets/ |
docker-compse.ymlの内容は以下の通り。分かりやすくするため間違いと正解を同時に記載しています。
my.cnf
を適当に配置して記述したのが間違い。(./docker-compose.yml
と並列に./conf/my.cnf
で配置)
docker-compose.yml
version: '3'
services:
db:
image: mysql:5.7
container_name: mysql
platform: linux/amd64
restart: always
environment:
MYSQL_ROOT_PASSWORD: ${ROOT_PASS}
MYSQL_DATABASE: ${DB_NAME}
MYSQL_USER: ${DB_USER}
MYSQL_PASSWORD: ${DB_PASS}
TZ: ${TZ}
ports:
- ${DB_PORT}:3306
volumes:
- db-store:/var/lib/mysql
- ./conf/my.cnf:/etc/mysql/conf.d/my.cnf (間違い)
- ./conf:/etc/mysql/conf.d (正解)
volumes:
db-store:
対策
Docker DesktopのTerminalからログイン
Containers > Nameのリンクをクリック > Logs/Inspect/Terminal/Files/Statusの中からTerminal
my.cnfの場所を探す。
sh-4.2# mysql --help | grep my.cnf
order of preference, my.cnf, $MYSQL_TCP_PORT,
/etc/my.cnf /etc/mysql/my.cnf /usr/etc/my.cnf ~/.my.cnf
存在した/etc/my.cnfの中身をチェック
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
docker-compose.ymlのmy.cnfの位置を変更。ディレクトリとファイルを間違えていた。
- ./conf/my.cnf:/etc/mysql/conf.d/my.cnf (間違い)
- ./conf:/etc/mysql/conf.d (正解)
2. データベースの壁
日本語データ入力をリトライするもエラーメッセージが出る。
SHOW VARIABLES LIKE 'chara%';
を実行すると正しく設定されている。
Variable_name | Value |
---|---|
character_set_client | utf8mb4 |
character_set_connection | utf8mb4 |
character_set_database | utf8mb4 |
character_set_filesystem | binary |
character_set_results | utf8mb4 |
character_set_server | utf8mb4 |
character_set_system | utf8 |
character_sets_dir | /usr/share/mysql/charsets/ |
対策
カラムの定義を変更する必要があった。
ALTER TABLE テーブル名 CHANGE 旧カラム名 新カラム名 VARCHAR(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
これでエラーは解消しました。
以上