Нечувствительный к акценту поиск в таблице InnoDB MySQL!

Я работаю над простым скриптом поиска, который просматривает два столбца определенной таблицы. По сути, я ищу совпадение либо между номером компании, либо ее названием. Я использую оператор LIKE в SQL, потому что я использую таблицы InnoDB (что означает отсутствие полнотекстового поиска).

Проблема в том, что я работаю в двуязычной среде (французский и английский), и у некоторых персонажей на французском языке есть акцент. Я хотел бы, чтобы символы с акцентом считались такими же, как и их аналог без акцента, другими словами é = e, e = é, à = a и т. д. У SO есть много вопросов, касающихся этой проблемы, но ни один из них, похоже, не работает для меня.

Вот мой оператор SQL:

SELECT id, name FROM clients WHERE id LIKE '%éc%' OR name LIKE '%éc%';

Я хотел бы, чтобы найти «école» и «ecole», но он находит только «école».

Я также хотел бы отметить, что мои таблицы все utf8_general_ci.

Помоги мне StackOverflow, ты моя единственная надежда! :)


person Gazillion    schedule 31.08.2010    source источник


Ответы (2)


Я собираюсь предложить вам еще один ответ.

Я только что прочитал, что utf8_general_ci нечувствителен к акценту, так что все должно быть в порядке.

Одним из решений является использование

 mysql_query("SET NAMES 'utf8'"); 

Это сообщает клиенту, какой набор символов для отправки операторов SQL.

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

person Jake N    schedule 02.09.2010

Возможно, вам следует подумать о преобразовании проблемных символов в их английские аналоги, а затем сохранить их в другом столбце, возможно, с именем searchable или подобным. Вам необходимо будет обновлять это всякий раз, когда ваш основной столбец обновляется.

Тогда у вас будет два столбца, один из которых содержит символы с диакритическими знаками, а другой — простое содержимое для поиска на английском языке.

person Jake N    schedule 31.08.2010
comment
Я не уверен, что мне хочется иметь дело с избыточными данными, тем более что я могу в конечном итоге использовать это решение в других областях, где контент намного больше, чем просто имя и идентификатор. Я знаю, что есть способы сделать это в PHP, поэтому я был бы удивлен, если бы не было решения для этого с MySQL. - person Gazillion; 02.09.2010