возможно иметь чувствительный к акценту и нечувствительный к регистру сопоставление utf8 в mysql? - PullRequest
6 голосов
/ 30 сентября 2011

Как я могу выполнить поиск utf8 без учета регистра, но без учета регистра в mysql? Utf8_bin чувствителен к регистру, а utf8_general_ci нечувствителен к ударению.

Ответы [ 3 ]

3 голосов
/ 17 декабря 2012

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

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.

2 голосов
/ 30 сентября 2011

Кажется, что нет такового, потому что чувствительность к регистру трудно сделать в Юникоде .

Существует сортировка utf8_general_cs, но она кажется экспериментальной, и согласно этот отчет об ошибке не делает то, что ожидается при использовании LIKE.

Если ваши данные состоят только из западных умляутов (то есть умляутов, включенных в ISO-8859-1), вы можете сопоставить свою операцию поиска с latin1_german2_ci или создать с ней отдельный столбец поиска.(этот конкретный порядок сортировки чувствителен к акценту согласно этой странице ; latin1_general_ci также может быть, я не знаю и сейчас не могу проверить).

1 голос
/ 31 января 2017

Вы можете использовать "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» необходимо выполнять только для тех две строки вместо полной таблицы.

...