Поиск в MYSQL с учетом регистра для поля utf8_bin
-
05-09-2019 - |
Вопрос
Я создал таблицу и установил параметры сортировки на utf8 для того, чтобы иметь возможность добавлять уникальный индекс к полю.Теперь мне нужно выполнить поиск без учета регистра, но когда я выполнил несколько запросов с ключевым словом collate и я получил:
mysql> select * from page where pageTitle="Something" Collate utf8_general_ci;
ОШИБКА 1253 (42000):ПАРАМЕТР СОРТИРОВКИ 'utf8_general_ci' недопустим для НАБОР СИМВОЛОВ 'latin1'
mysql> select * from page where pageTitle="Something" Collate latin1_general_ci;
ОШИБКА 1267 (HY000):Незаконное сочетание параметров сортировки (utf8_bin, НЕЯВНЫЙ) и (latin1_general_ci, ЯВНЫЙ) для операции '='
Я довольно новичок в SQL, поэтому мне было интересно, может ли кто-нибудь помочь.
Решение
Строка в MySQL имеет набор символов и сопоставление.Utf8 - это набор символов, а utf8_bin - один из его параметров сортировки.Чтобы сравнить ваш строковый литерал со столбцом utf8, преобразуйте его в utf8, добавив к нему префикс обозначения _charset:
_utf8 'Something'
Теперь сопоставление допустимо только для некоторых наборов символов.Дело-чувствительный параметры сортировки для utf8 выглядят как utf8_bin, которые вы можете указать следующим образом:
_utf8 'Something' collate utf8_bin
С этими преобразованиями запрос должен работать:
select * from page where pageTitle = _utf8 'Something' collate utf8_bin
Префикс _charset работает со строковыми литералами.Чтобы изменить набор символов поля, существует функция CONVERT ...ИСПОЛЬЗУЯ.Это полезно, когда вы хотите преобразовать поле заголовка страницы в другой набор символов, как в:
select * from page
where convert(pageTitle using latin1) collate latin1_general_cs = 'Something'
Чтобы увидеть символ и параметры сортировки для столбца с именем 'col' в таблице с именем 'TAB', попробуйте:
select distinct collation(col), charset(col) from TAB
Список всех наборов символов и параметров сортировки можно найти с помощью:
show character set
show collation
И все допустимые параметры сортировки для utf8 можно найти с помощью:
show collation where charset = 'utf8'
Другие советы
Также, пожалуйста, обратите внимание, что в случае использования "Сопоставить utf8_general_ci" или "Сопоставить latin1_general_ci", т. е."принудительная" сортировка - такое преобразование предотвратит использование существующих индексов!В будущем это может стать узким местом для повышения производительности.
Попробуй это, у меня это работает
ВЫБЕРИТЕ * ИЗ users
ГДЕ ВЕРХНИЙ(name
) = ВЕРХНИЙ ('josé') ПАРАМЕТР СОРТИРОВКИ utf8_bin;
Могу я спросить, почему у вас есть необходимость явно изменять параметры сортировки при выполнении ВЫБОРА?Почему бы просто не выполнить сортировку так, как вы хотите получить записи при сортировке?
Проблема, с которой вы сталкиваетесь из-за того, что ваши поиски чувствительны к регистру, заключается в том, что у вас есть двоичная сортировка.Попробуйте вместо этого использовать общую сортировку.Для получения дополнительной информации о чувствительности к регистру и параметрах сортировки смотрите здесь:Чувствительность к регистру при поиске по строкам