MySQL 文字コードあれこれ
実家からたまに荷物が送られてくる。特に好きだって言ってないのに、うなぎボーンが毎回入ってる。
MySQLのsqlファイルをEC2のmysqlにリストアしようとすると....
Unknown collation: 'utf8mb4_0900_ai_ci'
コイツコイツ。なかなか直らない。キレそう。
文字コード確認してmy.cnfを直してみる。
mysql> SHOW VARIABLES LIKE '%char%'; で文字コードを見てmy.cnfに
[mysqld] character_set_server=utf8mb4 collation_server=utf8mb4_unicode_ci
↑を追加。そして再び↓のコマンド
mysql> SHOW VARIABLES LIKE '%char%'; +--------------------------------------+----------------------------+ | Variable_name | Value | +--------------------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | utf8mb4 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | utf8mb4 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | | validate_password_special_char_count | 1 | +--------------------------------------+----------------------------+
再びリストア
mysql -u root -p リストアdb < dump.sql Enter password: ERROR 1273 (HY000) at line 25: Unknown collation: 'utf8mb4_0900_ai_ci'
またダメだった!
SQLファイルの中の
COLLATE=utf8mb4_0900_ai_ci; を
COLLATE=COLLATE=utf8mb4_general_ci に変更。
$ mysql -u root -p リストアdb < dump.sql Enter password:パスワード入力 $
エラーなし!DB確認したらテーブル作られてた....とりあえずはよかった。
Collationってなんぞ。
MySQLは文字コードのほかにソート順を持っていて、ソート順のことをCollationと呼ぶのだ。
比較するときには文字コードだけでなくてCollationが一致するかどうかを比較するらしい。
だから一致しないとjoinとかwhereでエラーが出たり、あいまい検索の結果が違ったりする。
今回のutf8mb4_general_ciは
アルファベットの大文字小文字は区別しない。他はすべて区別する....というCollation.
他にもCollationはある....けど、とりあえずはこれで。
久々に時間かかった。