MYSQL поиск с учетом регистра для поля utf8_bin - PullRequest
18 голосов
/ 23 мая 2009

Я создал таблицу и установил параметры сортировки на utf8 , чтобы иметь возможность добавить уникальный индекс в поле. Теперь мне нужно выполнить поиск без учета регистра, но когда я выполнил некоторые запросы с ключевым словом collate, я получил:

mysql> select * from page where pageTitle="Something" Collate utf8_general_ci;

ОШИБКА 1253 (42000): COLLATION 'utf8_general_ci' недействителен для Набор символов 'latin1'

mysql> select * from page where pageTitle="Something" Collate latin1_general_ci;

ОШИБКА 1267 (HY000): Неверное сочетание параметров сортировки (utf8_bin, IMPLICIT) и (latin1_general_ci, EXPLICIT) для операции '='

Я довольно новичок в SQL, поэтому мне было интересно, может ли кто-нибудь помочь.

Ответы [ 4 ]

40 голосов
/ 23 мая 2009

Строка в 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 ... USING. Это полезно, если вы хотите преобразовать поле pageTitle в другой набор символов, например:

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'
2 голосов
/ 23 декабря 2015

Попробуйте, это работает для меня

SELECT * FROM users WHERE UPPER (name) = UPPER ('josé') COLLATE utf8_bin;

2 голосов
/ 18 мая 2013

Также обратите внимание, что в случае использования "Collate utf8_general_ci" или "Collate latin1_general_ci", т.е. "принудительного" сопоставления - такое преобразование предотвратит использование существующих индексов! В будущем это может стать узким местом для производительности.

1 голос
/ 23 мая 2009

Могу ли я спросить, почему у вас есть необходимость явно изменить параметры сортировки, когда вы делаете SELECT? Почему бы просто не сопоставить то, как вы хотите получать записи при сортировке?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...