Russian Qt Forum

Qt => Базы данных => Тема начата: andrew.k от Июнь 25, 2010, 12:03



Название: ilike: Posgresql 7.4 + qt4.4.2
Отправлено: andrew.k от Июнь 25, 2010, 12:03
Есть такой запрос: select count(*) from abonents where name ilike='%аб%';
в таблице есть два абонента Абонент1 и Абонент2.
Грабли: через терминал psql запрос выполняется как я и ожидал. Возвращает 2.
В программе выполняю запрос через QSqlQuery.
получат 0.
ilike срабатывает как like (регистрозависимый)
Почему?


Название: Re: ilike: Posgresql 7.4 + qt4.4.2
Отправлено: Kolobok от Июнь 25, 2010, 13:05
Русские буквы в коде это плохо. Кроме того, регистрозависимость и нелатинские символы в базах часто не дружат. Не знаю, как в этой.


Название: Re: ilike: Posgresql 7.4 + qt4.4.2
Отправлено: andrew.k от Июнь 25, 2010, 13:32
Русские буквы в коде это плохо. Кроме того, регистрозависимость и нелатинские символы в базах часто не дружат. Не знаю, как в этой.
Русские буквы в коде чисто для примера. В любом случа значение берется с формы и там по любому будет использоваться русский набор.
Заметил еще одну вещь. не работают встроенные функции, например:
запрос "select lower(name) from abonents" возвращает name в неизменном виде, если работать через QSqlQuery.
Кто подскажет в чем проблема? А пока пошел читат асситента.


Название: Re: ilike: Posgresql 7.4 + qt4.4.2
Отправлено: andrew.k от Июнь 25, 2010, 15:30
Подозреваю, что проблема кроется где-то в collate-ах. :)
Смутно представляю себе что это такое, сейчас мне это представляется неким набором правил сортировки с функций работы с регистром символов. Вот видимо для пользователя postgres этот коллэйт отличается от установленного для БД.
Домашний каталог для postrgres установлен в /var/lib/pgsql
там есть файл .i18n . Подозреваю, что правильно исправив этот файл, получу нужный результат.
в нем заданы три параметра:
PG_DEFAULT_DB_ENCODING=KOI8
PG_SERVER_LOCALE=ru_RU.KOI8-R

и отдельно ниже:
# Настройка языкового окружения пользователя postgres
LANG=POSIX

Исправил POSIX на ru_RU
привело к тому что функция lower("Абонент") возвращает "АБОНЕНт".
Зато по крайней мере похоже, что я двигаюсь в правильном направлении.
Кто понимает, что такое локаль и коллэйт помогите! :)
Что-то не могу найти ничего в инете освещающего данные термины )


Название: Re: ilike: Posgresql 7.4 + qt4.4.2
Отправлено: andrew.k от Июнь 25, 2010, 15:39
проблема решилась.
РЕШЕНИЕ: LANG=ru_RU.KOI8-R
это привело к нужному результату.
Тема закрыта, за исключением ссылок на тему локалей/коллейтов, чтобы лучше понимать что это и как с этим работать.

Вот и поговорили  ;D


Название: Re: ilike: Posgresql 7.4 + qt4.4.2
Отправлено: Пантер от Июнь 25, 2010, 16:35
Используй UTF-8, чтобы проблем не было.