MySQLのバージョン: 5.5.44-0+deb8u1 (Debian)
普段はutf8で利用しているデータベースで、utf8mb4なテーブルを作成する必要があった。
mysql> CREATE TABLE items (name VARCHAR(30)) DEFAULT CHARSET=utf8mb4;
Query OK, 0 rows affected (0.00 sec)
mysql> INSERT INTO items (name) VALUES ('hogehoge');
Query OK, 1 row affected (0.00 sec)
mysql> SELECT * from items;
+----------+
| name |
+----------+
| hogehoge |
+----------+
1 row in set (0.00 sec)
で、このテーブルからSELECTする際に照合順序を明示的にutf8mb4_unicode_ci
に指定すると、エラーが出る。
mysql> SELECT * FROM items WHERE name LIKE '%ge%' COLLATE utf8mb4_unicode_ci;
ERROR 1253 (42000): COLLATION 'utf8mb4_unicode_ci' is not valid for CHARACTER SET 'utf8'
調べたところ、このエラーはcharacter_set_database
が関係しているらしい。
mysql> SHOW VARIABLES LIKE 'character_set_database';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| character_set_database | utf8 |
+------------------------+-------+
1 row in set (0.00 sec)
LIKE句の文字列をutf8mb4でキャスト(?)すると解決する。
mysql> SELECT * FROM items WHERE name LIKE _utf8mb4'%ge%' COLLATE utf8mb4_unicode_ci;
+----------+
| name |
+----------+
| hogehoge |
+----------+
1 row in set (0.00 sec)
Railsだと以下のように書く。
Item.where('name LIKE _utf8mb4? COLLATE utf8mb4_unicode_ci', '%ge%')