възможно ли е да има чувствително към акцента и нечувствително към главни и малки букви utf8 сортиране в mysql?

Как мога да извърша utf8 търсене с чувствителност към ударение, но без значение за малки и главни букви в mysql? Utf8_bin е чувствителен към главни и малки букви, а utf8_general_ci не е чувствителен към акцентите.


person ts.    schedule 30.09.2011    source източник
comment
Не днес... Но ако искате сгъване на главни и малки букви, но чувствителност към акцентите, моля, подайте заявка на bugs.mysql.com .   -  person Rick James    schedule 15.03.2017


Отговори (3)


Изглежда, че няма такъв, защото чувствителността към малки и главни букви е трудно се прави в Unicode.

Има utf8_general_cs съпоставяне, но изглежда, че е експериментално и според този доклад за грешка, не прави това, което се очаква, когато използва LIKE.

Ако вашите данни се състоят само от западни умлаути (т.е. умлаути, които са включени в ISO-8859-1), може да сте в състояние да съпоставите вашата операция за търсене до latin1_german2_ci или да създадете отделна колона за търсене с нея (това конкретно съпоставяне е чувствително към акцента според към тази страница latin1_general_ci може да е като добре, не знам и не мога да тествам в момента).

person Pekka    schedule 30.09.2011

Ако искате да различавате "café" от "cafe", можете да използвате:

Select word from table_words WHERE Hex(word) LIKE Hex("café");

По този начин ще върне „кафене“.

В противен случай, ако използвате:

Select word from table_words WHERE Hex(word) LIKE Hex("cafe");

ще се върне кафене. Използвам съпоставката latin1_german2_ci.

person Alexandre    schedule 16.12.2012

Можете да използвате "hex", за да направите търсенето чувствително към акцента. След това просто добавете lcase, за да го направите отново без значение. Така че това ще даде:

SELECT name FROM people WHERE HEX(LCASE(name)) = HEX(LCASE("René"))

Вие наистина изхвърляте всичките си индекси от прозореца по този начин. Ако искате да избегнете необходимостта да правите пълно сканиране на таблица и имате индекс на "име", също потърсете същото нещо без шестнадесетичен и lcase:

SELECT name FROM people WHERE name = "René" and HEX(LCASE(name)) = HEX(LCASE("René"))

По този начин индексът на "name" ще се използва за намиране например само на редовете "René" и "Rene" и след това сравнението с "hex" трябва да се направи само на тези два реда, вместо на цялата таблица.

person Bart Mortelmans    schedule 31.01.2017
comment
Ако искате сгъване на главни и малки букви, но чувствителност към акцентите, моля, подайте заявка на bugs.mysql.com . - person Rick James; 15.03.2017