Как провести Accent Sensitive поиск в MySql - PullRequest
58 голосов
/ 01 февраля 2009

У меня есть таблица MySQL с общим сопоставлением utf8. В таблице я вижу две записи:

Абад
Абад

Я использую запрос, который выглядит следующим образом:

SELECT *  FROM `words` WHERE `word` = 'abád'

Результат запроса дает оба слова:

Абад
Абад

Есть ли способ указать, что я хочу, чтобы MySQL только нашел акцентированное слово? Я хочу, чтобы запрос только возвращал

abád

Я также пробовал этот запрос:

SELECT *  FROM `words` WHERE BINARY `word` = 'abád'

Это не дает мне никаких результатов. Спасибо за помощь.

Ответы [ 10 ]

82 голосов
/ 01 февраля 2009

Если ваши поиски в этом поле всегда будут чувствительными к акценту, объявите параметры сортировки поля как utf8_bin (которые будут сравнивать для равенства байты в кодировке utf8) или используйте языковые параметры сортировки, различающие акцентированные и не акцентированные символы.

col_name varchar(10) collate utf8_bin

Если поиски обычно нечувствительны к акценту, но вы хотите сделать исключение для этого поиска, попробуйте;

WHERE col_name = 'abád' collate utf8_bin
13 голосов
/ 23 августа 2010

В моей версии (MySql 5.0) отсутствует поиск в кодировке utf8 для поиска без учета регистра и акцента. Единственный чувствительный к акценту шаблон для utf8 - это utf8_bin. Однако он также чувствителен к регистру.

Моя работа заключалась в том, чтобы использовать что-то вроде этого:

SELECT * FROM `words` WHERE LOWER(column) = LOWER('aBád') COLLATE utf8_bin
3 голосов
/ 24 февраля 2011

Ошибка MySQL для дальнейшего использования http://bugs.mysql.com/bug.php?id=19567.

1 голос
/ 17 сентября 2013

Проверьте, заканчивается ли тип сортировки таблицы базы данных на «_ci», Это означает отсутствие учета регистра ...

Измените его на сопоставление с таким же или ближайшим именем без "_ci" ...

Например ... замените "utf8_general_ci" на "utf8_bin" МКЭ

1 голос
/ 01 мая 2013

Я получаю ту же ошибку.

Я изменил параметры сортировки моей таблицы на utf8_bin (через phpMyAdmin), и проблема была решена.

Надеюсь, это поможет! :)

0 голосов
/ 16 апреля 2018

Это работает для поиска без учета акцента и без учета регистра в MySql server 5.1 в базе данных в utf8_general_ci, где column является LONGBLOB.

select * from words where '%word%' LIKE column collate utf8_unicode_ci

с

select * from words where'%word%' LIKE column collate utf8_general_ci

результат чувствителен к регистру, но не чувствителен к акценту.

0 голосов
/ 05 декабря 2017

Принятый ответ хорош, но учтите, что вам, возможно, придется вместо этого использовать COLLATE utf8mb4_bin!

WHERE col_name = 'abád' collate utf8mb4_bin

Выше исправляет ошибки, такие как:

MySQL сказал: Документация 1253 - COLLATION 'utf8_bin' недействителен для Набор символов 'utf8mb4'

0 голосов
/ 26 августа 2009

Ну, вы только что описали, что такое объединение utf8_general_ci (a, á, à, â, ä, å равны a в сравнении).

В MySQL server 5.1 также произошли изменения в отношении utf8_general_ci и utf8_unicode_ci, так что это также зависит от версии сервера. Лучше проверь документы.

Итак, если это MySQL server 5.0, я бы выбрал utf8_unicode_ci вместо utf8_general_ci, что явно не подходит для вашего варианта использования.

0 голосов
/ 01 февраля 2009

Вы можете попробовать найти шестнадцатеричную переменную символа HEX () в mysql и использовать аналогичную функцию в вашем языке программирования и сопоставить их. Это хорошо сработало для меня, когда я делал листинг, где человек мог выбрать первую букву человека.

0 голосов
/ 01 февраля 2009
SELECT *  FROM `words` WHERE column = 'abád' collate latin1_General_CS 

(или ваше сопоставление, включая cs)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...