Изменить: если вы здесь, потому что вас смущает польская сортировка в MySQL, прочтите это.
Я пытаюсь выполнить полнотекстовый поиск по таблице городов Польши, и многие из них содержат символы с диакритическими знаками. Он предназначен для использования в вызове ajax для автоматического завершения, поэтому было бы неплохо, если бы поиск был нечувствительным к акценту. Я установил сортировку строк на ut8_polish_ci
. Теперь, учитывая город "Зелув", я запрашиваю базу данных следующим образом
SELECT * FROM
citiesWHERE MATCH( city ) AGAINST ("zelow")
но безрезультатно. Mysql возвращает пустой результат. Я пробовал разные акценты, пробовал добавлять к запросу разные сопоставления, но ничего не помогло. Я не уверен, как мне подойти к этому, потому что чувствительность к акценту, похоже, плохо задокументирована. Любые идеи?
РЕДАКТИРОВАТЬ
Итак, я обнаружил, что полнотекстовый поиск без учета регистра выполняется только В БУЛЕВОМ РЕЖИМЕ, поэтому правильный запрос будет
SELECT * FROM
citiesWHERE MATCH( city ) AGAINST ( "zelow" IN BOOLEAN MODE )
Раньше я думал иначе из-за вводящего в заблуждение комментария на dev.mysql.com. Может быть, есть еще кое-что, но я просто сейчас очень запутался.
В любом случае, как упоминалось в комментариях ниже, у меня есть индекс UNIQUE в столбце городов, поэтому об изменении сортировки таблицы на нечувствительность к акценту utf8_general_ci не может быть и речи.
Однако я понял, что следующий запрос довольно хорошо работает с таблицей с сопоставлением utf8_polish_ci:
SELECT * FROM
citiesWHERE city LIKE 'zelow' COLLATE utf8_general_ci
Казалось бы, сейчас наиболее разумным решением было бы проделать полнотекстовый поиск аналогичным образом:
SELECT * FROM
citiesWHERE 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. Я ценю всю помощь, она направила меня в правильном направлении.