たぬき君、廊下に立っとれ

忘れることなかれ。学んだことと感謝とあれこれ

MySQL 文字コードあれこれ

実家からたまに荷物が送られてくる。特に好きだって言ってないのに、うなぎボーンが毎回入ってる。

 

MySQLsqlファイルを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はある....けど、とりあえずはこれで。

久々に時間かかった。