Unicode сортировка без учета регистра в MySQL - PullRequest
4 голосов
/ 10 декабря 2010

У меня есть база данных, в которой мы храним имена пользователей с заглавной первой буквой каждого имени - то есть 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,это известная ошибка с сопоставлениями Юникода, исправление которой имеет приоритет «новая функция», т. е. не будет завершено в течение любого разумного периода времени.

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

Ответы [ 4 ]

1 голос
/ 11 декабря 2010

Хорошо работает для меня с версией 5.1.42-community

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

0 голосов
/ 22 января 2013

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

show variables like '%char%';

Для моего персонажа character_set_client было установлено значение 'utf8', а для character_set_connection и character_set_results установлено значение 'latin1'. Таким образом, функции UPPER, LOWER, LIKE не работали должным образом.

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

mysql_query("SET NAMES utf8");

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

0 голосов
/ 14 декабря 2010

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

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

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

0 голосов
/ 11 декабря 2010

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

...