пятница, 31 мая 2013 г.

Сломанный collation utf8_general_ci в MySQL 5.1.x

Наступил на забавные грабли при копировании базы с mysql 5.0.51 на mysql 5.1.49. Сделал дамп базы и скопировал на тестовый сервер, но при импорте произошла ошибка

ERROR 1062 (23000) at line 8615879: Duplicate entry 'Voß' for key 'ticketwords'

Пробую найти значение в уже добавленных строках, которое конфликтует со значением 'Voß'

mysql> select * from swticketwords where contents = 'Voß';
+--------------+----------+
| ticketwordid | contents |
+--------------+----------+
|        20080 | Vos      |
+--------------+----------+
1 row in set (0.00 sec)

Ерунда какая-то. Получается, что база считает 'Vos' = 'Voß' и отказывается добавлять значение. Начинаю гуглить и сразу натыкаюсь на репорты в багтрекере MySQL [1] [2]. Если в кратце, то разрабы поломали collation utf8_general_ci (который работал в mysql 5.0.x) и отказываются его чинить в mysql 5.1.x, мотивируя это тем, что фикс сломает еще больше.

Чтобы хоть как-то решить проблему был создан отдельный collation utf8_general_mysql500_ci, который возвращает старое поведение. Я поправил дамп, указав явный collation для таблицы swticketwords, и база успешно импортировалась. Чтобы показать разницу между utf8_general_ci и utf8_general_mysql500_ci я сделал запросы со старым и новым collation.

mysql> select * from swticketwords where contents = 'Voß' collate utf8_general_ci;
+--------------+----------+
| ticketwordid | contents |
+--------------+----------+
|        20080 | Vos      |
|       126378 | Voß      |
+--------------+----------+
2 rows in set (0.00 sec)

На поле contents создан уникальный ключ ticketwords, и двух значений быть не должно.
mysql> select * from swticketwords where contents = 'Voß' collate utf8_general_mysql500_ci;
+--------------+----------+
| ticketwordid | contents |
+--------------+----------+
|       126378 | Voß      |
+--------------+----------+
1 row in set (0.00 sec)

Ссылки:
1) http://bugs.mysql.com/bug.php?id=27877
2) http://bugs.mysql.com/bug.php?id=43593
3) http://dev.mysql.com/doc/refman/5.1/en/charset-unicode-sets.html

Комментариев нет:

Отправить комментарий