LoginSignup
8
5

More than 5 years have passed since last update.

MySQLでutf8mb4なテーブルで照合順序を明示的に指定した際にエラーが発生した

Last updated at Posted at 2016-03-02

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%')
8
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
5