Редактировать: если вы здесь, потому что вас смущает польская сортировка в 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. Я ценю всю помощь, она направила меня в правильном направлении.