MYSQL чувствительный к регистру поиск для поля utf8_bin

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

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

ОШИБКА 1253 (42000): COLLATION 'utf8_general_ci' недействителен для CHARACTER SET 'latin1'

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

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

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


person Community    schedule 23.05.2009    source источник


Ответы (4)


Строка в 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 работает со строковыми литералами. Чтобы изменить набор символов поля, есть ПРЕОБРАЗОВАТЬ ... ИСПОЛЬЗОВАНИЕ. Это полезно, если вы хотите преобразовать поле 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'
person Andomar    schedule 23.05.2009
comment
Потрясающе - у меня была аналогичная проблема, но мне нужен latin1 вместо utf8, _latin1 сделал эту работу за меня. - person Crazy Joe Malloy; 01.11.2010

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

person Maksim    schedule 18.05.2013

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

ВЫБРАТЬ * ИЗ users ГДЕ ВЕРХНИЙ (name) = ВЕРХНИЙ ('josé') СОБРАТЬ utf8_bin;

person user3041121    schedule 23.12.2015

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

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

person PatrikAkerstrand    schedule 23.05.2009
comment
Но что, если мне нужна двоичная сортировка, и мне нужен поиск без учета регистра. При обычном сопоставлении, если у вас есть уникальное поле, вы получите ошибку при попытке вставить «Čačak», если «Cacak» уже существует. - person umpirsky; 27.01.2010