Нечувствительный к акценту поиск / проблемы с сопоставлением utf8_general_ci

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

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

SELECT * FROMcitiesWHERE MATCH( city ) AGAINST ("zelow")

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


РЕДАКТИРОВАТЬ

Итак, я обнаружил, что полнотекстовый поиск без учета регистра выполняется только В БУЛЕВОМ РЕЖИМЕ, поэтому правильный запрос будет

SELECT * FROMcitiesWHERE MATCH( city ) AGAINST ( "zelow" IN BOOLEAN MODE )

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

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

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

SELECT * FROMcitiesWHERE city LIKE 'zelow' COLLATE utf8_general_ci

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

SELECT * FROMcitiesWHERE 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. Я ценю всю помощь, она направила меня в правильном направлении.


person Marcin Wasilewski    schedule 19.08.2011    source источник


Ответы (4)


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

person dee-see    schedule 19.08.2011
comment
Проблема в том, что столбец, в котором хранятся названия городов, имеет уникальный ключ. А как насчет таких городов, как Островик и Островик, которые совершенно разные? Если я изменю сопоставление на utf8_general_ci, mysql сообщит, что в этом столбце есть повторяющаяся запись. Поэтому я хотел бы сохранить текущую сортировку в таблице, но выполнять только поиск без учета акцента. Я попытался добавить COLLATE utf8_general_ci в конце запроса, но mysql сообщает # 1253 - COLLATION 'utf8_general_ci' недействителен для CHARACTER SET 'binary' - person Marcin Wasilewski; 20.08.2011
comment
Посмотрите, может ли вам помочь этот вопрос. - person dee-see; 20.08.2011
comment
Спасибо, но я уже погуглил :(. См. Исходное сообщение об обновлении. - person Marcin Wasilewski; 20.08.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

person Brent Baisley    schedule 20.08.2011
comment
Речь идет о немного других вещах. Я хочу, чтобы моя таблица была utf8_polish_ci, чтобы обеспечить правильное хранение и сортировку, но при этом иметь возможность выполнять полнотекстовый поиск с другим сопоставлением. Набор символов таблицы IS utf8. Это невозможно, что может быть либо ошибкой mysql, либо функцией, которую я не понял. Вы можете попробовать это сами: CREATE TABLE test (name VARCHAR (10) NOT NULL) ENGINE = MYISAM CHARACTER SET utf8 COLLATE utf8_polish_ci; и попробуйте выполнить полнотекстовый поиск SELECT * FROM test WHERE MATCH (name) AGAINST (whatever) COLLATE utf8_general_ci; - person Marcin Wasilewski; 20.08.2011
comment
Вероятно, вы захотите изменить поле на utf8_polish_ci. Таким образом, таблица будет иметь вид utf8_general_ci, но поле будет иметь другое сопоставление. Вы можете изменить таблицу и просто изменить параметры сортировки для одного поля. Хотя UTF8 обычно обрабатывает символы с диакритическими знаками так, как вы хотите. - person Brent Baisley; 21.08.2011

Если вы пытаетесь :

select * from cities where cityname like 'zelow'
person Cygnusx1    schedule 19.08.2011
comment
Делай, как сказал Ваш ... Я проверил свою базу данных, и сортировка была utf_general_ci. и все заработало как ожидалось - person Cygnusx1; 19.08.2011

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

person Stephen Ostermiller    schedule 10.05.2012