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://www.freeimagehosting.net/uploads/0e7c2ae7d5.png

Спасибо!

Ответ 1

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

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 | 
+---------------------------------+

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

Ответ 2

Если вы установите кодировку таблицы в 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, вы можете выбрать сортировку при создании своей таблицы.

Ответ 3

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

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

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

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

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

Ответ 4

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

Ответ 5

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

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

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

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

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