Russian Qt Forum
Ноябрь 23, 2017, 17:53 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: PostgreSQL 9 и поле bytea  (Прочитано 597 раз)
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 407


И это не всегда помогает


Просмотр профиля
« : Октябрь 18, 2017, 18:51 »

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

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

Как мало времени и как много нужно узнать
GraninDm
Чайник
*
Offline Offline

Сообщений: 84


Просмотр профиля
« Ответ #1 : Октябрь 20, 2017, 12:54 »

Код драйвера смотрели?
Может по коду понятнее будет?

Какая версия Qt?
« Последнее редактирование: Октябрь 20, 2017, 12:57 от GraninDm » Записан
GraninDm
Чайник
*
Offline Offline

Сообщений: 84


Просмотр профиля
« Ответ #2 : Октябрь 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

И напишите пример кода как вы работаете с bytea?
Записан
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 407


И это не всегда помогает


Просмотр профиля
« Ответ #3 : Октябрь 20, 2017, 20:17 »

Qt 3.3.8
В поле хранятся разнородные данные, могут быть текстовые, могут быть двоичные.

Сначала считывается в массив байт, а потом обрабатывается в соответствии с типом данных.
Код чтения из SQL-запроса
Код:

      QByteArray rez1=sqlIM2.value(2).toByteArray();

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

Как мало времени и как много нужно узнать
GraninDm
Чайник
*
Offline Offline

Сообщений: 84


Просмотр профиля
« Ответ #4 : Октябрь 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.
Записан
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 407


И это не всегда помогает


Просмотр профиля
« Ответ #5 : Октябрь 23, 2017, 15:58 »

спасибо, подумаю
Записан

Как мало времени и как много нужно узнать
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 407


И это не всегда помогает


Просмотр профиля
« Ответ #6 : Октябрь 23, 2017, 20:43 »

Не хочется в драйвер лазить... Может кто подскажет, как hex преобразовать bytea старого типа?
Записан

Как мало времени и как много нужно узнать
GraninDm
Чайник
*
Offline Offline

Сообщений: 84


Просмотр профиля
« Ответ #7 : Октябрь 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('\'');
Записан
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 407


И это не всегда помогает


Просмотр профиля
« Ответ #8 : Октябрь 25, 2017, 10:33 »

Драйвер для QT5 очень уж много чем отличается от драйвера для qt3. Интересно, а можно как то его собрать под QT3?
Записан

Как мало времени и как много нужно узнать
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 407


И это не всегда помогает


Просмотр профиля
« Ответ #9 : Ноябрь 07, 2017, 15:08 »

Решил проблему обработкой bytea после считывания в память. Там все нулевые байты и байты с 1 в старшем бите заменены на "\ххх" (косая черта и десятичное значение байта тремя восьмеричными цифрами). Ну и еще, если есть как символ сама косая черта, то она продублирована и одну надо удалить.
Записан

Как мало времени и как много нужно узнать
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Страница сгенерирована за 0.048 секунд. Запросов: 22.