MySQL возвращает несколько результатов для одного смайлика

Я наблюдаю какое-то странное поведение MySQL для полей VARCHAR, содержащих один эмодзи. Соединение, база данных и столбец - все это кодировка и сопоставление utf8mb4.

Есть таблица под названием categories с полями id и title. Там три ряда с названиями ????, ???? и ????.

Когда я запускаю запрос на поиск строки с заголовком ????, я также получаю все остальные строки с отдельными смайликами, как будто MySQL обрабатывает их как одни и те же символы.

Запрос эмодзи кредитной карты, возвращающий все остальные отдельные строки эмодзи

Ожидаемое поведение должно заключаться в том, что будет возвращена только строка с ????.


person maknz    schedule 09.03.2017    source источник


Ответы (2)


Вам нужна сортировка utf8mb4_unicode_520_ci; старые сопоставления рассматривают Emoji как равные.

person Rick James    schedule 13.03.2017
comment
Для ознакомления с MySQL 8.0 с Unicode 9.0 см. utf8mb4_0900_ai_ci в здесь. - person Rick James; 17.03.2017

Сопоставление определяет, считаются ли два символа равными или нет.

https://dev.mysql.com/doc/refman/5.7/en/charset-unicode-sets.html

Если вам нужно только точное двоичное совпадение, вы можете указать двоичное сопоставление.

Некоторые примеры синтаксиса здесь для latin1.

https://dev.mysql.com/doc/refman/5.7/en/case-sensitivity.html

person spencer7593    schedule 09.03.2017
comment
Действительно, проблема, похоже, связана с utf8mb4_general_ci, тогда как utf8mb4_unicode_ci работает с эмодзи, как и ожидалось. - person maknz; 10.03.2017
comment
@maknz - что-то не так с вашим тестом; юникод не подходит; вам нужен unicode_520; см. мой ответ. - person Rick James; 14.03.2017
comment
Использование utf8mb4_unicode_ci решает проблему, что делает 520, чего не делает сам юникод? - person maknz; 15.03.2017
comment
@maknz: _520_ в имени сопоставления указывает, что это реализация версии 5.2.0 или алгоритма сопоставления Unicode (UCA). Имена без _520_ реализуют более раннюю версию (UCA 4.0.0). MySQL также имеет параметры сортировки, обратно совместимые с параметрами сортировки, реализованными в более ранних версиях MySQL. - person spencer7593; 15.03.2017
comment
Хорошо, я думаю, я просто в тупике, почему обычный unicode_ci исправляет мой пример выше, когда это не так.. предназначено? Есть ли конкретные случаи, когда unicode_520_ci будет работать лучше, чем unicode_ci, или это просто лучшая практика? - person maknz; 16.03.2017
comment
Ах... на самом деле, это, вероятно, потому, что я использую форк Percona MySQL (5.6). Не могу найти никакой литературы о каких-либо различиях Unicode с MySQL, но это может быть так. - person maknz; 16.03.2017
comment
Я не слышал, чтобы вилки отличались комплектациями. 520 различает некоторые символы, которые раньше считались одинаковыми. Эмодзи — один из таких наборов. Среди букв несколько отмечены в здесь, например ae=Æ=æ < az вместо из ae < az < Æ=æ. См. также Ď,Ł,Ø - person Rick James; 17.03.2017
comment
Спасибо за разъяснения. Я отметил ваш ответ как правильный, учитывая, что это лучшее решение для поддержки смайликов. - person maknz; 23.03.2017