Melorian
@Melorian
PHP, JAVA-разработчик

Проблемы с поиском буквы "Й" в PostgreSQL 8.4

Доброе утро, уважаемые хабражители. Столкнулся сейчас со странным поведением PostgreSQL, при поиске по имени и фамилии пользователей.

Волей случая, приходится пользоваться PostgreSQL 8.4, и столкнулся с проблемой.

В запросе есть некоторая строка:
AND (ARRAY_TO_STRING(ARRAY[first_name, last_name] , ' ') ILIKE :search


В базе есть, к примеру, три человека, «Василий Иванов», «Ингеборга Дапкунайте» и «Михаил Михайлов».
Пытаюсь вытащить из таблицы все записи, для которых в указанном в запросе выше параметре подставляю просто одну букву «Й».

Результат: находятся Ингеборга и Михаил, Василий же отметается из результата.

Получается, проблема происходит в том случае, если буква «Й» стоит на конце первого из двух соединяемых слов, в данном случае, «Василий».

Вопрос — почему так происходит, и как этого можно избежать?
  • Вопрос задан
  • 2787 просмотров
Пригласить эксперта
Ответы на вопрос 2
alexius2
@alexius2
1) А какая у вас используется кодировка и локаль?

2) На запросах типа
select '1' where 'Василий Иванов' ilike '%Й%'
ошибка воспроизводится?

3) так, наверное, лучше строки склеивать:
AND first_name || ' ' || last_name ILIKE :search
Ответ написан
Комментировать
@ragajaga
Аналогичная ситуация. Скажем, в базе есть две строки с одинаковыми словами в кодировке UTF-8, локаль RU:
1. ханты-мансийский автономный округ
2. ханты-мансийский автономный округ

Как видно строки идентичны, но при запросе
select * from test where like (%мансийский%);
получаем результат равный одной строке с номером 1. В то же время, если я ввожу запрос
select * from test where like (%мансийскии%);
то получаю результат равный одной строке с номером 2. При этом, обратите внимание, запросы имеют разные окончания "Й" и "И".
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы