Вопрос

Я создал таблицу и установил параметры сортировки на 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;

Могу я спросить, почему у вас есть необходимость явно изменять параметры сортировки при выполнении ВЫБОРА?Почему бы просто не выполнить сортировку так, как вы хотите получить записи при сортировке?

Проблема, с которой вы сталкиваетесь из-за того, что ваши поиски чувствительны к регистру, заключается в том, что у вас есть двоичная сортировка.Попробуйте вместо этого использовать общую сортировку.Для получения дополнительной информации о чувствительности к регистру и параметрах сортировки смотрите здесь:Чувствительность к регистру при поиске по строкам

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top