Столкнулся со следующей проблемой: вставив некоторые двоичные данные из приложения в поле «bytea» в нашей базе данных PostgreSQL 9.2, мы выяснили, что их длина удваивается.
Приложение написано на C ++ и использует библиотеку SQL API для доступа к Postgres.
Ссылка на официальный документ: http://www.sqlapi.com/HowTo/blobs.html
Сказать, что длина данных удвоена, означает, что перед командой вставки в приложение мы имеем:
sContent.length () = 19
тем временем в postgres мы получаем:
выберите длину (bindata) = 38, bit_length (bindata) = 304 из binpacket
В приложении C ++ мы делаем:
SAString sContent = SomeFunctionConvertsByteArrayToSAString(bindata);
cmd.Param("bindata").setAsLargeBinary() = sContent; //SA_dtLongBinary <=> BYTEA
//watch: sContent.length() = 19
cmd.Execute();
и иметь длину поля, удвоенную в postgres (выберите длину (bindata) = 38).
Я написал простой скрипт на Python3, который вставляет двоичные данные из файла в базу данных:
bindataStream = open('C:\\Temp\\bin.dat', 'rb').read()
cursor.execute("INSERT INTO binpacket( bindata ) VALUES (%s)",
(psycopg2.Binary(bindataStream ),))
и длина вставленных данных равна исходному файлу двоичных данных.
Это приводит меня к выводу, что в Postgres 9 можно вставлять двоичные данные, не удваивая их длину (размер). Но возможно ли, когда источником данных является байтовый массив?
Пожалуйста, помогите найти правильное решение, как вставить байтовые двоичные данные в Postgres.
Разъяснения описанной ситуации также приветствуются.
С наилучшими пожеланиями, Энтони
Чтобы устранить описанную проблему, обновите SQLAPI ++ 4.1.2 (это бесплатно для легальных клиентов, таких как мы).
Разработчики исправили проблему с двоичными данными для Postgres 9.x. в SQLAPI ++ 4.1.2 Release.
Других решений пока нет …