PostgreSQL bytea вставка двоичных данных
Столкнулся со следующей проблемой: вставив некоторые двоичные данные из приложения в поле "bytea" в нашей базе данных PostgreSQL 9.2, мы обнаружили, что их длина удваивается. Приложение написано на C++ и использует библиотеку SQL API для доступа к Postgres. Ссылка на официальный документ: http://www.sqlapi.com/HowTo/blobs.html
Сказать, что длина данных удвоена, означает, что перед командой вставки в приложение у нас есть: sContent.length() = 19, а в postgres мы получаем: select length(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. Разъяснения описанной ситуации также приветствуются.
С наилучшими пожеланиями, Энтони
1 ответ
Чтобы устранить описанную проблему, обновите SQLAPI++ 4.1.2 (это бесплатно для легальных клиентов, таких как мы). Разработчики исправили проблему с двоичными данными для Postgres 9.x. в SQLAPI++ 4.1.2 Release.