MySQL диакритический нечувствительный поиск (испанские акценты) - PullRequest
10 голосов
/ 22 июля 2010

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

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

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

альтернативный текст http://www.freeimagehosting.net/uploads/0e7c2ae7d5.png

Спасибо!

Ответы [ 5 ]

22 голосов
/ 22 июля 2010

Наборы символов и сопоставления, не мои любимые, но они действительно работают:

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

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

6 голосов
/ 22 июля 2010

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

4 голосов
/ 19 марта 2013

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

Я использую запрос:

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

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

SELECT CONVERT(column_name USING utf8) FROM table_name LIKE '%giga%'
2 голосов
/ 19 июля 2013

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

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

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

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

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

2 голосов
/ 22 июля 2010

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

...