Проблема с utf8_general_ci

В таблице содержатся поля: name, author и другие.
name и author — FULLTEXT индексы.
Делаю поиск по этим полям. Вот мой запрос:
SELECT *, MATCH (`name`, `author`) AGAINST ('+моя_строка' IN BOOLEAN MODE) as REL
FROM `editions`
WHERE MATCH (`name`, `author`) AGAINST ('+моя_строка' IN BOOLEAN MODE)
ORDER BY REL DESC
LIMIT 0, 10


Все работает и исполняется, но теперь встает вопрос: как сделать такой же вариант, но проигнорировав регистр? (Ответ "Хранить в полях name и author данные в нижнем регистре" не принимается)
  • Вопрос задан
  • 3112 просмотров
Решения вопроса 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Использовать case-insensitive collation для `name` и `author`.
Добавил здесь
Collation: uft8_unicode_ci
SELECT `name`, 
    MATCH(`name`) AGAINST ('+Пупкин' IN BOOLEAN MODE) AS REL1, 
    MATCH(`name`) AGAINST ('+пупкин' IN BOOLEAN MODE) AS REL2, 
    MATCH(`name`) AGAINST ('+ПУПКИН' IN BOOLEAN MODE) AS REL3, 
    MATCH(`name`) AGAINST ('+пУПКИН' IN BOOLEAN MODE) AS REL4
FROM `test`;

Получаем:
+-----------------+--------------------+--------------------+--------------------+--------------------+
|     `name`      |       `REL1`       |       `REL2`       |       `REL3`       |       `REL4`       |
+-----------------+--------------------+--------------------+--------------------+--------------------+
| 'Вася Пупкин'   | 0.0906190574169159 | 0.0906190574169159 | 0.0906190574169159 | 0.0906190574169159 |
| 'вася пупкин'   | 0.0906190574169159 | 0.0906190574169159 | 0.0906190574169159 | 0.0906190574169159 |
| 'Дуся Пупкина'  | 0                  | 0                  | 0                  | 0                  |
| 'Маша Люськина' | 0                  | 0                  | 0                  | 0                  |
+-----------------+--------------------+--------------------+--------------------+--------------------+

То есть релевантность не зависит от регистра.
Ответ написан
IPRIT
@IPRIT Автор вопроса
Для тех, кто столкнулся с такой же проблемой — вот мое решение:
По умолчанию character_set_server устанавливается сервером как latin1, если не изменить в конфиге БД. Если у вас нет доступа к редактированию конфига, то после соединения с БД в вашем скрипте, делайте следующие SQL-запросы:
SET CHARACTER SET utf8
SET NAMES utf8
За место utf8 можете поставить подходящую вам кодировку.
После этих строк utf8_general_ci прекрасно работает, соответственно, включается регистронезависимый поиск по строке для оператора LIKE или конструкции MATCH AGAINST.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы