Как я могу выполнить поиск utf8 с учетом акцента, но без учета регистра в mysql? Utf8_bin чувствителен к регистру, а utf8_general_ci нечувствителен к диакритическому знаку.
возможно ли иметь сортировку utf8 с учетом акцента и регистра без учета регистра в mysql?
Ответы (3)
Кажется, его нет, потому что чувствительность к регистру сложно сделать в Unicode.
Существует сопоставление utf8_general_cs
, но оно кажется экспериментальным, и согласно этому отчету об ошибке, не делает того, что ожидается при использовании LIKE.
Если ваши данные состоят только из западных умлаутов (т. е. умлаутов, включенных в ISO-8859-1), вы можете сопоставить свою операцию поиска с latin1_german2_ci
или создать с ней отдельный столбец поиска (эта конкретная сортировка чувствительна к ударению в соответствии с на эту страницу; latin1_general_ci
может быть как ну, я не знаю и не могу проверить прямо сейчас).
Если вы хотите отличить «кафе» от «кафе», вы можете использовать:
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.
Вы можете использовать "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
» необходимо выполнять только для этих двух строк, а не для всей таблицы.