Нечувствительный к акценту поиск / проблемы с сортировкой utf8_general_ci - PullRequest
2 голосов
/ 19 августа 2011

Редактировать: если вы здесь, потому что вас смущает польская сортировка в MySQL, прочитайте это .

Я пытаюсь выполнить полнотекстовый поиск по таблице польских городов, и многие из них содержат символы с акцентом. Он предназначен для использования в вызове ajax для автоматического завершения, поэтому было бы неплохо, если бы поиск был нечувствительным к акценту. Я установил параметры сортировки строк на ut8_polish_ci. Теперь, учитывая город "Zelów", я запрашиваю базу данных, как это

SELECT * FROM 1010 * города *

но безрезультатно. Mysql возвращает пустой результат. Я пробовал разные акценты, пытался добавить разные запросы в запрос, но ничего не помогло. Я не уверен, как мне подходить к этому, потому что чувствительность к акценту плохо документирована. Есть идеи?


EDIT

Итак, я обнаружил, что полнотекстовый поиск без учета регистра выполняется только в режиме BOOLEAN, поэтому правильный запрос будет

SELECT * FROM город WHERE MATCH( city ) AGAINST ( "zelow" IN BOOLEAN MODE )

Ранее я думал иначе из-за вводящего в заблуждение комментария на dev.mysql.com . Там может быть что-то еще, но я просто очень смущен прямо сейчас.

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

Однако я понял, что следующий запрос довольно хорошо работает с таблицей с сопоставлением utf8_polish_ci:

SELECT * FROM город WHERE city LIKE 'zelow' COLLATE utf8_general_ci

Теперь кажется, что наиболее разумным решением было бы выполнить полнотекстовый поиск аналогичным образом:

SELECT * FROM город WHERE MATCH( city ) AGAINST ( 'zelow' IN BOOLEAN MODE ) COLLATE utf8_genral_ci

Это, однако, приводит к следующей ошибке:

#1253 - COLLATION 'utf8_general_ci' is not valid for CHARACTER SET 'binary'

Это действительно начинает действовать мне на нервы. Можно также отказаться от полнотекстового поиска в пользу простого подхода «где-то», но он не кажется разумным в таблице с почти 50 тыс. Записей, которые будут интенсивно запрашиваться ...


ПОСЛЕДНИЕ РЕДАКТИРОВАТЬ Хорошо, вещь с булевым режимом была отчасти ерундой. Только отчасти потому, что это действительно работает, как я сказал, однако, на utf8_general_ci это работает наоборот. Я совершенно сбит с толку и не желаю изучать этот вопрос дальше. Я решил отбросить индекс UNIQUE (больше городов не будет добавлено, так что нет необходимости делать из этого большие сделки) и придерживаться таблицы сопоставления utf8_general_ci. Я ценю всю помощь, она направила меня в правильном направлении.

Ответы [ 4 ]

3 голосов
/ 19 августа 2011

Измените параметры сортировки на utf_general_ci.При поиске и упорядочении игнорирует акцент, но сохраняет их правильно.

2 голосов
/ 20 августа 2011

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

ALTER TABLE tablename CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;

Вы также можете конвертировать отдельные поля, чтобы ваша таблица имела параметр сортировки utf8_general_ci, но вы можете изменить одно или несколько полей, чтобы они использовали другие параметры сортировки.Основываясь на «бинарной» ошибке, которую вы видите, похоже, ваше текстовое поле может иметь сопоставление UTF8-BIN (или быть BLOB-объектом).Можете ли вы опубликовать результат CREATE TABLE?

Помните, что CHARACTER SET (кодировка) - это то, как данные хранятся, сортировка - как они индексируются.Не все комбинации работают.

Моя первоначальная проблема и вопрос могут немного помочь: Преобразование таблиц mysql из latin1 в utf8

0 голосов
/ 10 мая 2012

Измените параметры сортировки с двоичного на utf8_bin.utf8_bin должен быть совместим с utf8_general_ci, но все равно позволит вам хранить названия городов с разными акцентами.

0 голосов
/ 19 августа 2011

Если вы попробуете:

select * from cities where cityname like 'zelow'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...