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. Если у вас есть класс управления базой данных, который обертывает ваши базы данных, это легко применить к полному приложению. Если нет, вы должны установить это явно везде, где вы открываете соединение.
Я надеюсь, что это поможет кому-то, поскольку я уже волновался об этом!