MySQL
を使用して開発をしていたときに「 Illegal mix of collations
」というエラーが出ることがあったので、その時のエラーの解消方法をメモしておきます。
前提条件
- MySQL : 5.6
Illegal mix of collations とは
異なる CHARSET
同士を比較しようとするとこのエラーが発生します。
下記のテーブルを作成し、
mysql> show fields from sample;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(20) | YES | | NULL | |
| name2 | varchar(20) | YES | | NULL | |
+-------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)
name
の照合順序に「 utf8_general_ci
」、 name2
の照合順序に「 utf8_unicode_ci
」を設定しています。
この状態で下記のクエリを実行すると、
mysql> SELECT * FROM sample WHERE name = name2;
ERROR 1267 (HY000): Illegal mix of collations (utf8_general_ci,IMPLICIT) and (utf8_unicode_ci,IMPLICIT) for operation '='
Illegal mix of collations
エラーとなります。
解決方法
WHERE
句のところで COLLATE
を使用して CHARSET
を指定することでエラーを回避できます。
mysql> SELECT * FROM sample WHERE name = name2 COLLATE utf8_general_ci;
Empty set (0.00 sec)
データが入っていないので、結果は0件になりますが、エラーは出ないようになりました。
最後に
CHARSET
が異なるフィールドの比較をすることはあまりないかもしれませんが、今回の回避方法を知っていればエラーが発生しても慌てずに対処できそうですね。
コメント