Russian Qt Forum

Qt => Базы данных => Тема начата: Примерный ученик от Октябрь 18, 2017, 18:51



Название: PostgreSQL 9 и поле bytea
Отправлено: Примерный ученик от Октябрь 18, 2017, 18:51
Цитировать
Тип bytea поддерживает два внешних формата ввода и вывода: традиционный для PostgreSQL формат «спецпоследовательностей» и «шестнадцатеричный». Входные данные принимаются в обоих форматах, а формат выходных данных зависит от параметра конфигурации bytea_output; по умолчанию выбран шестнадцатеричный.

База импортирована из 8.1. Параметр  bytea_output выставлен в 'escape'. Те данные, которые уже были в базе - читаются корректно, а вот вновь записанные обратно читаются как "шестнадцатиричные". Как с этим бороться? ???


Название: Re: PostgreSQL 9 и поле bytea
Отправлено: GraninDm от Октябрь 20, 2017, 12:54
Код драйвера смотрели?
Может по коду понятнее будет?

Какая версия Qt?


Название: Re: PostgreSQL 9 и поле bytea
Отправлено: GraninDm от Октябрь 20, 2017, 13:26
Из документации
When entering bytea values in escape format, octets of certain values must be escaped, while all octet values can be escaped.
https://www.postgresql.org/docs/9.0/static/datatype-binary.html (https://www.postgresql.org/docs/9.0/static/datatype-binary.html)

И напишите пример кода как вы работаете с bytea?


Название: Re: PostgreSQL 9 и поле bytea
Отправлено: Примерный ученик от Октябрь 20, 2017, 20:17
Qt 3.3.8
В поле хранятся разнородные данные, могут быть текстовые, могут быть двоичные.

Сначала считывается в массив байт, а потом обрабатывается в соответствии с типом данных.
Код чтения из SQL-запроса
Код:
	
      QByteArray rez1=sqlIM2.value(2).toByteArray();

Для PostgreSQL До 8-й версии включительно все работало как надо. При переходе на 9-ю версию
все работать перестало. Существующие в БД данные воспринимаются корректно, а вот вновь записанные - воспринимаются
как 16-е, хотя в конфигурационном файле указано СУБД, что с полем bytea работать escape.


Название: Re: PostgreSQL 9 и поле bytea
Отправлено: GraninDm от Октябрь 23, 2017, 12:10
В Qt 5.6 в коде драйвера есть такой case
Код:
       case QVariant::ByteArray: {
            QByteArray ba(field.value().toByteArray());
            size_t len;
#if defined PG_VERSION_NUM && PG_VERSION_NUM-0 >= 80200
            unsigned char *data = PQescapeByteaConn(d->connection, (const unsigned char*)ba.constData(), ba.size(), &len);
#else
            unsigned char *data = PQescapeBytea((const unsigned char*)ba.constData(), ba.size(), &len);
#endif
            r += QLatin1Char('\'');
            r += QLatin1String((const char*)data);
            r += QLatin1Char('\'');
            qPQfreemem(data);
            break;
        }

А вот в 3.3.8 я не смотрел. Посмотрите сами...
А думаю 3.3.8 ничего про 9 постгрес не знает.
Может быть скомпилить драйвер с изменениями.

Одно время я для себя немного драйвер допиливал, пока этe функциональность не включили в Qt.


Название: Re: PostgreSQL 9 и поле bytea
Отправлено: Примерный ученик от Октябрь 23, 2017, 15:58
спасибо, подумаю


Название: Re: PostgreSQL 9 и поле bytea
Отправлено: Примерный ученик от Октябрь 23, 2017, 20:43
Не хочется в драйвер лазить... Может кто подскажет, как hex преобразовать bytea старого типа?


Название: Re: PostgreSQL 9 и поле bytea
Отправлено: GraninDm от Октябрь 24, 2017, 08:31
А то, что я уже написал, пробовали?

When entering bytea values in escape format, octets of certain values must be escaped, while all octet values can be escaped.

Код:
            r += QLatin1Char('\'');
            r += QLatin1String((const char*)data);
            r += QLatin1Char('\'');


Название: Re: PostgreSQL 9 и поле bytea
Отправлено: Примерный ученик от Октябрь 25, 2017, 10:33
Драйвер для QT5 очень уж много чем отличается от драйвера для qt3. Интересно, а можно как то его собрать под QT3?


Название: Re: PostgreSQL 9 и поле bytea
Отправлено: Примерный ученик от Ноябрь 07, 2017, 15:08
Решил проблему обработкой bytea после считывания в память. Там все нулевые байты и байты с 1 в старшем бите заменены на "\ххх" (косая черта и десятичное значение байта тремя восьмеричными цифрами). Ну и еще, если есть как символ сама косая черта, то она продублирована и одну надо удалить.