面對以下問題:將一些二進制數據從應用程序插入PostgreSQL 9.2數據庫中的「bytea」字段,我們發現它的長度增加了一倍。 該應用程序是用C++編寫的,並使用SQL API庫來訪問Postgres。 參考官方DOC:http://www.sqlapi.com/HowTo/blobs.htmlPostgreSQL bytea二進制數據插入
話說數據長度加倍裝置,這個int應用插入命令之前,我們有: 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中,而不必將其長度(大小)加倍。但是當數據源是一個字節陣列時可能嗎?
請幫忙找到一個正確的解決方案,如何將bytea二進制數據插入到Postgres中。 所述情況的解釋也將受到讚賞。
最好的問候,安東尼
大小翻倍時,場內的內容是什麼? –
爲什麼要首先將bindata轉換爲SAString?您是否設置了SA_UNICODE,以便SAString使用16位字符? – jjanes
@jjanes,關於SA_Unicode的建議看起來沒錯,還沒有完成檢查。但是,如果是這樣,是否有一種方法可以將數據傳遞到sql server而不會翻倍爲16位字符?我的意思是,我們沒有在SQLAPI ++ doc中找到任何合法的方法來做到這一點,而不需要SASting。我們不希望在整個項目中將SASTring設置爲8位,只是爲了描述插入問題。 – xacinay