Russian Qt Forum

Qt => Базы данных => Тема начата: Disaron от Июль 16, 2009, 09:08



Название: Qt + PostgreSQL + UTF-8
Отправлено: Disaron от Июль 16, 2009, 09:08
При записи в БД на постгре из клиентского приложения кириллического текста - туда пишутся юникодовские кракозябры, хотя занесенное через запрос в анализаторе запросов отображается нормально. Кто-нить подскажет как устранить? - по форуму не нашел (или слепой :/ ).
БД на UTF-8.
ЗЫ: в qDebug() выводится нормально этот же текст.


Название: Re: Qt + PostgreSQL + UTF-8
Отправлено: Admin от Июль 16, 2009, 09:55
Современные базы данных требуют, что бы клиент сообщил на какой кодировке он общаеться с базой данных. В Mysql это типа "SET NAMES utf-8", в посгрессе типа set encoging utf-8. Вы так делаете?


Название: Re: Qt + PostgreSQL + UTF-8
Отправлено: Disaron от Июль 16, 2009, 10:18
Пробовал query.exec("SET CLIENT_ENCODING TO 'UTF8'") и ... TO 'WIN1251'")
во втором случае введенные данные отображаются и вводятся нормально, НО теперь квадраты на уже существующих данных. Использую под виндой драйвер ODBC PostgreSQL Unicode. Под линуксом пока не тестировал - там PQSQL.
Может в одбц-драйвере косяк. Я уже голову поломал.
ЗЫ: все с QTextCodec тоже перепробовал. Хотя конечно может и не все, но из того что нашел.


Название: Re: Qt + PostgreSQL + UTF-8
Отправлено: BaltikS от Июль 16, 2009, 10:44
На куя использовать ODBC? Через ODBC скорость работы ниже... Напрямую (через драйвер QPSQL) всё пашет без косяков в кодировке...


Название: Re: Qt + PostgreSQL + UTF-8
Отправлено: Disaron от Июль 16, 2009, 11:10
Это было как временное решение - чтобы не трахаться со сборкой QPSQL для венды.


Название: Re: Qt + PostgreSQL + UTF-8
Отправлено: BaltikS от Июль 16, 2009, 11:30
Disaron, скажу по секрету, это получилось бы гораздо быстрее, чем ты трахаешься с ODBC. Там в комплекте с PostgreSQL идёт SDK. Указываешь Qt на эти пути, даёшь две волшебные команды и всё.... qsqlpsql.dll  собран! Если есть вопросы по сборке - это отдельная тема для разговора.
А с ODBC неудобен, хотя бы тем, что нужны дрова postgres под ODBC. => сложности с установкой, настройкой и куча ещё всяких прелестей :)


Название: Re: Qt + PostgreSQL + UTF-8
Отправлено: Disaron от Июль 16, 2009, 11:39
Буду премного благодарен за эти 2 команды. :)


Название: Re: Qt + PostgreSQL + UTF-8
Отправлено: BaltikS от Июль 16, 2009, 11:43
qmake
make
ТОлько не забудь прописать пути к Lib и H Postgres, да и про Libpq тоже не забывай, что она должна быть видна системой


Название: Re: Qt + PostgreSQL + UTF-8
Отправлено: Disaron от Июль 16, 2009, 11:55
Я наверно чего-то не понимаю: делаю все по топикам, но получаю только .a файл на выходе, а dll`ками не пахнет.


Название: Re: Qt + PostgreSQL + UTF-8
Отправлено: BaltikS от Июль 16, 2009, 11:58
Точнее напишу так, всё равно будут вопросы:)... Как делаю я...
1) Ставлю PostgreSQL из сетапа (мне хватает версии 8.1.15)
2) Создаю(или добавляю) переменные окружения include, lib и PATH
3) Прописываю в них пути для PostgreSQL. Обычно это путь дл include - C:\Program Files\PostgreSQL\8.1\include, для lib - C:\Program Files\PostgreSQL\8.1\lib. Если работаем в MS Visual Studio, то путь для lib немного иной C:\Program Files\PostgreSQL\8.1\lib
4) В переменнную PATH прописываю (дописываю) C:\Program Files\PostgreSQL\8.1\bin
5) Захожу в каталог QTDIR\src\plugins\sqldrivers\psql
6) В командной строке даю следующие команды: qmake, make. Если работаете в MS Visual Studio команда - nmake
7) Наблюдаем за компиляцией и в случае успеха проверяем наличие драйвера (файл qsqlpsq.dll) по пути QTDIR\plugins\sqldrivers.
8) Проверяем наличие драйвера QPSQL и соединения в программе QTDIR\demos\sqlbrowser\release\sqlbrowser.exe

ПРИМЕЧАНИЕ: Всё написанное выше действительно при:
- наличие переменных окружения QTDIR, QMAKESPEC;
- наличиие в переменной окружения PATH пути %QTDIR/bin%;
- если сборка QT не статическая (без флага -static)
   Компиляция драйвера QT для других СУБД аналогично описанному выше способу, отличием будет лишь наличие других SDK Субд и клиентского драйвера (В нашем случае libpq.dll).

Удачи!


Название: Re: Qt + PostgreSQL + UTF-8
Отправлено: BaltikS от Июль 16, 2009, 12:00
Я наверно чего-то не понимаю: делаю все по топикам, но получаю только .a файл на выходе, а dll`ками не пахнет.
проверь пункт 4 и 5.


Название: Re: Qt + PostgreSQL + UTF-8
Отправлено: Disaron от Июль 16, 2009, 12:03
Я нашел свою ошибку - не надо было CONFIG+=STATIC вписывать :) СПАСИБО!


Название: Re: Qt + PostgreSQL + UTF-8
Отправлено: BaltikS от Июль 16, 2009, 12:06
При выполнении все пунктов можно и со static. Только заново Qt собирать надо. В этом случае дравер у тебя будет включен в исполняемый файл. И не забывай, что за собой всегда надо таскать libpq.dll.


Название: Re: Qt + PostgreSQL + UTF-8
Отправлено: Disaron от Июль 16, 2009, 12:10
BaltikS, огромный тебе решпект! Все заработало и проблема была в ODBC. C родным драйвером все прекрасно.


Название: Re: Qt + PostgreSQL + UTF-8
Отправлено: BaltikS от Июль 16, 2009, 12:20
Да нзчто...всегда рад помочь ;)........если конечно знаю чем... :)


Название: Re: Qt + PostgreSQL + UTF-8
Отправлено: Disaron от Июль 16, 2009, 13:28
Ан нет, рано обрадовался.
Не обратил внимания на то что забивал и прочитал то, что уже существовало.
Та же канитель с кракозябрами, только теперь еще почему-то часть запросов отвалилась, при этом если меняю тип соединения - все работает. Соединение поднимается в единственном сырце и работает на все приложение.
Код:
#include "connection.h"


bool dbconnected()
{
  QSqlDatabase db = QSqlDatabase::addDatabase("QODBC");
  db.setDatabaseName("DRIVER=PostgreSQL Unicode;PORT=5432;SERVER=127.0.0.1;DATABASE=ASU;UID=asu;PWD=111");
  return db.open();
}

bool dbconnectedlnx()
{
  QSqlDatabase db = QSqlDatabase::addDatabase("QPSQL");
  db.setHostName("127.0.0.1");
  db.setDatabaseName("ASU");
  db.setUserName("asu");
  db.setPassword("111");
  return db.open();
}
Два запроса в одной форме такого рода
select * from fn_pred_list(); //отрабатывает всегда
select * from fn_pred_insert(:name_pred, :name_pred_s) //не отрабатывает, хотя отрабатывает если я в форме использую dbconnected(), а не dbconnectedlnx()

Может есть какие-то нюансы в использовании QPSQL?
UP: Опаньки, executedQuery возвращает select * from fn_pred_insert(?, ?) оно плейсхолдеры что-ли не поддерживает? В случае с одбц запрос нормальный возвращается.

Вот такой код биндит все нужные значения:
Код:
QSqlQuery wBaseList::FillQueryFields(QString query, QStringList params)
{
    QSqlQuery *sqlQuery = new QSqlQuery();
    sqlQuery->prepare(query);
    QStringList::const_iterator paramsIterator;
    for (paramsIterator = params.begin(); paramsIterator != params.end(); ++paramsIterator)
    {
        QWidget *obj;
        obj = fmDialog->findChild<QWidget*>("fld"+*paramsIterator);
        if (fmDialog->findChild<QWidget*>("fld"+*paramsIterator))
        {
            if (obj->inherits("QLineEdit"))
                sqlQuery->bindValue(":"+*paramsIterator,obj->property("text"));
        }
    }
    return *sqlQuery;
}
потом этот запрос присваивается к другому в вызывающей функции, добиндиваются ключевые поля в случае необходимости и выполняется.


Название: Re: Qt + PostgreSQL + UTF-8
Отправлено: BaltikS от Июль 16, 2009, 15:49
Погоди, так вопрос в кодировке или не выполнении запроса? Какой PostgreSQL? По-поводу кодировки всё должно быть в норме.... Потому как лет 5 уже под него пишу и каких то отклонений существенных не наблюдаю...


Название: Re: Qt + PostgreSQL + UTF-8
Отправлено: Disaron от Июль 16, 2009, 15:55
вопроса теперь оба :)
postgre 8.3
причем boundvalue("") возвращает прибинденное значение, но результат запроса - пустой.
среда - QtCreator, Qt 4.5.2
Конечно нет пока возможности проверить на никсах - это когда домой приду.

UP: вопрос с неотработкой запроса снимается - нашел свой косяк, спасибо
qDebug() << sqlQuery.boundValues() :)
кодировка пока на той-же стадии... :(

UP2: с кодировкой вопрос тоже снят, теперь точно - можно закрывать.  ::)

UP3: кстати чтобы уж завершить: в одбц все равно кракозябры. :) так что не зря повозился.


Название: Re: Qt + PostgreSQL + UTF-8
Отправлено: Примерный ученик от Июль 21, 2009, 10:37
При выполнении все пунктов можно и со static. Только заново Qt собирать надо. В этом случае дравер у тебя будет включен в исполняемый файл. И не забывай, что за собой всегда надо таскать libpq.dll.
Как показывает мой опыт, нужно еще таскать
comerr32.dll
krb5_32.dll
libeay32.dll
libiconv-2.dll
libintl-2.dll
ssleay32.dll

Только тогда наличие PostgreSQL на компе не нужно


Название: Re: Qt + PostgreSQL + UTF-8
Отправлено: Пантер от Июль 21, 2009, 11:42
Можно самому собрать постгрес и тогда нужно будет только libpq.dll


Название: Re: Qt + PostgreSQL + UTF-8
Отправлено: BaltikS от Июль 21, 2009, 13:36
Можно самому собрать постгрес и тогда нужно будет только libpq.dll
+1
Примерный ученик, твой опыт видимо ещё достаточно мал :).... Без обид....


Название: Re: Qt + PostgreSQL + UTF-8
Отправлено: Примерный ученик от Июль 21, 2009, 16:38
Можно самому собрать постгрес и тогда нужно будет только libpq.dll
+1
Примерный ученик, твой опыт видимо ещё достаточно мал :).... Без обид....
А чего обижаться. Просто я не вижу смысла собирать PostgreSQL, если есть великолепный инсталятор. А одна dll или несколько особого значения не имеет...


Название: Re: Qt + PostgreSQL + UTF-8
Отправлено: BaltikS от Июль 21, 2009, 17:41
Примерный ученик, так то оно так, только вот из за этой великолепной пятёрки DLL, в NT 4, libpq - не пашет ;)... 


Название: Re: Qt + PostgreSQL + UTF-8
Отправлено: Примерный ученик от Июль 22, 2009, 13:05
Примерный ученик, так то оно так, только вот из за этой великолепной пятёрки DLL, в NT 4, libpq - не пашет ;)... 
К счастью, мои проги будут работать начиная с WINDOWS 2000. Там проблем нет.
А за инфу спасибо. Зарекаться от чего либо глупо. Сделаю зарубку на память...


Название: Re: Qt + PostgreSQL + UTF-8
Отправлено: Khs от Июль 22, 2009, 13:48
Можно самому собрать постгрес и тогда нужно будет только libpq.dll
+1
Примерный ученик, твой опыт видимо ещё достаточно мал :).... Без обид....
А чего обижаться. Просто я не вижу смысла собирать PostgreSQL, если есть великолепный инсталятор. А одна dll или несколько особого значения не имеет...

а зачем пересобирать весь postgresql, можно собрать libpq отдельно, секундное дело..