возможно ли иметь сортировку 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

Если вы хотите отличить «кафе» от «кафе», вы можете использовать:

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