Търсене с чувствителност към главни и малки букви в 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 работи с низови литерали. За да промените набора от знаци на поле, има 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'
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", т.е. "force" collate - такова конвертиране ще предотврати използването на съществуващи индекси! Това може да бъде тясно място в бъдеще за производителността.

person Maksim    schedule 18.05.2013

Опитайте това, при мен работи

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

person user3041121    schedule 23.12.2015

Мога ли да попитам защо трябва изрично да промените сортирането, когато правите SELECT? Защо просто не съпоставите по начина, по който искате да извлечете записите, когато са сортирани?

Проблемът, който имате с това, че вашите търсения са чувствителни към главни и малки букви, е, че имате двоично сортиране. Опитайте вместо това да използвате общото сортиране. За повече информация относно чувствителността към малки и главни букви и сортирането вижте тук: Чувствителни към малки и главни букви в Търсене на низ

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