libpq работа с бинарными данными

День добрый
Я работаю с PostgreSQL 8.4
возникли проблемы при попытке вставить бинарные данные.

const char * paramValues[1];
int paramLengths[1];
int paramFormats[1];
 
int    binaryIntVal = 4;
paramValues[0] = (char*)&binaryIntVal;
paramLengths[0] = sizeof(int);;
paramFormats[0] = 1;
 
res = PQexecParams(conn,"INSERT INTO table_user(user_accauntstr) VALUES ( $1::bytea[] )",1,NULL,paramValues,paramLengths,paramFormats,1); 

В результате получаю ошибку:
PGRES_FATAL_ERROR: number of array dimensions (67108864) exceeds the maxi
mum allowed (6)

тип столбца в базе bytea[]

Что я не правильно делаю?
До сих пор максимум что добился это пройти по данным HEX-сом и сохранить как текст, но при этом их размер растет в 2 раза.
Задача в целом написать шаблон для сохранения, в базу и чтения обратно небольших структур размером от 10 до 1000 байт

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Может быть так "INSERT INTO

Может быть так
"INSERT INTO table_user(user_accauntstr) VALUES ( $1::bytea[6] )"

нет, так результат остается

нет, так результат не изменяется
К тому же непонятно почему именно 6 ? ведь в параметрах передается 4 байта

Исключение из-за ограничения

Исключение из-за ограничения длины массива. Возможно не удается преобразовать значения входного параметра в нужный тип.

откуда берется ограничение ?

откуда берется ограничение ? При инсерте массив изначально пуст, так как его еще нет))
Да еще что хотелось бы добавить если подать команду без бинда параметров просто текст то все работает

res = PQexec(conn, "INSERT INTO table_users(user_accauntstr) VALUES ( '{0xFF,0x23,0x45,10}' )");

>откуда берется

>откуда берется ограничение
Не знаю, но ошибка говорит о превышении допустимого размера массива.
если успешно выполняется код, с явным указанием значений массива, значит проблема с преобразованием типов. Т.е. на входе не bytea[].
воз можно стоит сделать так

int binaryIntVal = 4;
paramValues[0] = {(char*)&binaryIntVal};
paramLengths[0] = {sizeof(int)};
paramFormats[0] = {1};

Предложенный вами код , к

Предложенный вами код , к сожалению компилятор не кушает.
да еще менял тип данных столбца на text тоже нет результата, там правда материться на недопустимый символ в последовательности, но это уже понятно больше почему.

мне кажется, что проблема все

мне кажется, что проблема все таки не в типе столбца, а в формате массива, который Postgres не может интерпритировать.

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023