MySQL диакритический бесчувственный поиск (испанский акценты)

У меня есть база данных MySQL со словами, содержащими акценты на испанском языке (áéíóú). Я хотел бы знать, есть ли способ сделать диакритический бесчувственный поиск. Например, если я ищу «lapiz» (без акцента), я бы хотел получить результаты, содержащие слово «lápiz» из моего db. То, как я сейчас выполняю запрос, выглядит следующим образом:

$result = mysql_query("SELECT * FROM $lookuptable WHERE disabled = '0' AND name LIKE '%$q%' OR productCode LIKE '%$q%' LIMIT $sugglimit"); 

Это для интернет-магазина, поэтому я не знаю, что люди будут искать … «lapiz» – это просто и пример.

alt text http://img.ruphp.com/php/www.freeimagehosting.net

Благодаря!

Наборы символов и сортировки, а не мои любимые, но они работают:

 mysql> SET NAMES latin1; mysql> SELECT 'lápiz' LIKE 'lapiz'; +-----------------------+ | 'lápiz' LIKE 'lapiz' | +-----------------------+ | 0 | +-----------------------+ 1 row in set (0.01 sec) mysql> SET NAMES utf8; mysql> SELECT 'lápiz' LIKE 'lapiz'; +-----------------------+ | 'lápiz' LIKE 'lapiz' | +-----------------------+ | 1 | +-----------------------+ mysql> SET NAMES latin1; mysql> SELECT _utf8'lápiz' LIKE _utf8'lapiz' ; +---------------------------------+ | _utf8'lápiz' LIKE _utf8'lapiz' | +---------------------------------+ | 1 | +---------------------------------+ 

Хорошая глава для чтения в руководстве: Поддержка набора символов

Если вы установите кодировку таблицы в UTF-8 и сопоставление с utf8 _ * _ ci (_ci означает «без учета регистра») MySQL выполнит поиск по словам и без акцентов по умолчанию

Подробнее о кодировках и коллаборациях читайте здесь:
http://dev.mysql.com/doc/refman/5.1/en/charset-charsets.html

Я тестировал его и

 "lapiz" matches: "lápiz," "lapíz," and "lapiz" "nino" matches: "niño," "ninó," and "nino" 

Вы можете настроить сортировку таблицы при создании:

 CREATE TABLE table ( ... ) CHARACTER SET uft8 COLLATE utf8_general_ci; 

Или вы можете ALTER если он уже существует. Для получения дополнительной информации прочитайте руководство (ссылка выше).
Если вы используете phpMyAdmin, вы можете выбрать сортировку при создании своей таблицы.

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

Я использую следующий запрос:

 SELECT CONVERT('gîgă' USING utf8) LIKE '%giga%' 

Или в более вероятном случае поиска столбца в таблице вы можете использовать:

 SELECT CONVERT(column_name USING utf8) FROM table_name LIKE '%giga%' 

Сохраните вторую версию строки, которая была лишена диакритики?

На всякий случай кто-то сталкивается с этой проблемой, я нашел способ решить эту проблему, по крайней мере, для меня, не путаясь с наборами символов и сопоставлениями в запросах MySQL.

Я использую PHP для вставки и извлечения записей из базы данных. Хотя моя база данных, таблицы и столбцы – utf8, а также кодировка файлов PHP, правда состоит в том, что кодирование, используемое в соединении между PHP и MySQL, выполняется с использованием latin1. Мне удалось найти это, используя $ mysqli-> character_set_name (); где $ mysqli – ваш объект.

Для того чтобы поиски начали работать как ожидалось, возвращая акцентирующую и нечувствительные записи для символов с акцентами или нет, я должен явно установить набор символов для соединения.

Для этого вам просто нужно сделать следующее: $ mysqli-> set_charset ('utf8'); где $ mysqli – ваш объект mysqli. Если у вас есть класс управления базой данных, который обертывает ваши базы данных, это легко применить к полному приложению. Если нет, вы должны установить это явно везде, где вы открываете соединение.

Надеюсь, это поможет кому-то, поскольку я уже волновался об этом!