Сортировка Unicode без учета регистра в MySQL

У меня есть база данных, в которой мы храним имена пользователей с заглавной первой буквой каждого имени, то есть IsaacSparling. Я пытаюсь выполнить автозаполнение без учета регистра для моей базы данных MySQL (v5.1.46). Таблица имеет кодировку UTF8 и сортировку utf8_unicode_ci. Я также провел эти тесты с сопоставлением utf8_general_ci.

Обычный текст ASCII работает нормально:

mysql> select username from users where username like 'j%';
+----------------+
| username       |
+----------------+
| J********      |
| J***********   |
| J************* |
+----------------+
3 rows in set (0.00 sec)

mysql> select username from users where username like 'J%';
+----------------+
| username       |
+----------------+
| J********      |
| J***********   |
| J************* |
+----------------+
3 rows in set (0.00 sec)

(имена отредактированы, но они есть).

Однако, когда я пытаюсь сделать то же самое для символов Юникода вне набора ASCII, мне не повезло:

mysql> select username from users where username like 'ø%';
Empty set (0.00 sec)


mysql> select username from users where username like 'Ø%';
+-------------+
| username    |
+-------------+
| Ø*********  |
+-------------+
1 row in set (0.00 sec)

Некоторое расследование привело меня к следующему: http://bugs.mysql.com/bug.php?id=19567 (tl; dr, это известная ошибка с сопоставлением юникода, и ее исправление осуществляется с приоритетом «новая функция», т. е. не будет завершено в разумные сроки).

Кто-нибудь обнаружил какие-либо эффективные обходные пути, которые позволяют без учета регистра искать символы Unicode в MySQL? Любые мысли приветствуются!


person isparling    schedule 10.12.2010    source источник
comment
Интересный вопрос! Насколько я понимаю, ошибка не связана с вашей проблемой? Вроде бы про акцентную чувствительность a = ›á   -  person Pekka    schedule 10.12.2010
comment
Вы можете проверить, работает ли where LOWER(username) LIKE 'ø%'? Скорее всего, он будет подвержен тому же поведению, но если это не так, это может служить обходным решением.   -  person Pekka    schedule 10.12.2010
comment
mysql ›выберите 1 из пользователей, где LOWER (имя пользователя) LIKE 'ø%'; Пустой набор (0,00 сек) Без кубиков. Похоже, что переход регистра для символов Unicode за пределами набора ascii полностью заблокирован. Спасибо за идею!   -  person isparling    schedule 10.12.2010


Ответы (4)


У меня отлично работает с версией 5.1.42-community

Возможно, ваш клиент mysql неправильно отправил символы Юникода. Я тестировал с sqlYog, и он отлично работал с сопоставлениями utf8_unicode_ci и utf8_general_ci

person Zeke Kievel    schedule 11.12.2010

ЕСЛИ то, что вас волнует, это возможность упорядочить значения полей по тексту, не заботясь о том, в верхнем или нижнем регистре, я думаю, что лучшее, что вы можете сделать, - это адресовать поле вместо того, чтобы вводить просто username, введите LOWER(username) username, а затем вы может отлично использовать заказ по этому полю, называя его по имени

person mariana soffer    schedule 11.12.2010

Вы пробовали использовать CONVERT? Что-то типа

WHERE `lastname` LIKE CONVERT( _utf8 'ø%' USING latin1 )

может сработать для вас.

person Community    schedule 14.12.2010

Я решил ту же проблему с помощью запроса

show variables like '%char%';

Мой character_set_client был установлен на «utf8», но character_set_connection и character_set_results были установлены на «latin1». Таким образом, функции UPPER, LOWER, LIKE не работали должным образом.

Я только что вставил строчку

mysql_query("SET NAMES utf8");

сразу после подключения, чтобы поиск работал без учета регистра.

person andriy.ca    schedule 22.01.2013