結論
文字コードが原因でした。
原因はすぐにわかっても解消に時間を要したので備忘録
詰まった流れ
文字コードの事は何も意識せず、WSL2のUbuntuに入れたmySQLで
CREATE DATABASE
CREATE TABLE
まで行い、INSERTしようとしたら、
ERROR 1366 (HY000): Incorrect string value: '\xE5\x8C\x97\xE6\xB5\xB7...
とエラーを吐きました。
SHOW VARIABLES LIKE 'chara%';
を実行することで、文字コードを見れるとのことなので、確認
mysql> show variables like 'chara%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
character_set_database | latin1
となっているのは期待値ではありません。
期待値は
character_set_database | utf8
設定ファイルをいじる
# vi /etc/mysql/mysql.conf.d/mysqld.cnf
最下部に以下を追記
[character-set-server=utf8mb4]
二つ目、こちらもいじる
vi /etc/mysql/my.cnf
同様に最下部に以下を追記
[client]
default-character-set=utf8
[mysql]
default-character-set=utf8
[mysqldump]
default-character-set=utf8
[mysqld]
character-set-server=utf8
また詰まる
前出の2つの設定ファイルを編集後、再起動
# service mysql stop
# service mysql start
mysqlに接続して
再度確認
mysql> show variables like 'chara%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
お。期待値どおりやん。
と思い、INSERT文発行したら、同様のエラーを吐かれました。
そして、再度show variables like 'chara%';を実行すると、
character_set_database | latin1
へと逆戻り。なにこれ、、、
quitして、mySQLを再起動かけてもダメ。
色々と調べた結果、既にDBやテーブルが存在すると反映されないみたいです。
解決
設定ファイルをいじったあと、既に作成したDBが残っていると反映されないみたいです。
DROP文大量発行タイムです。
自分が作成した、DBをすべて削除したら、quitして、再起動。
DBを作成してみます。
> CREATE DATABASE hoge DEFAULT CHARACTER SET utf8;
> use hoge;
> show variables like 'chara%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
8 rows in set (0.00 sec)
と見事解決。
結論
- mysqlをinstallしたら最初に文字コードの確認やりましょう。
- 既に以前の文字コードで作成されたDBがあると、反映されません
ということでした。