2013-11-28 172 views
0

面對以下問題:將一些二進制數據從應用程序插入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中。 所述情況的解釋也將受到讚賞。

最好的問候,安東尼

+0

大小翻倍時,場內的內容是什麼? –

+1

爲什麼要首先將bindata轉換爲SAString?您是否設置了SA_UNICODE,以便SAString使用16位字符? – jjanes

+0

@jjanes,關於SA_Unicode的建議看起來沒錯,還沒有完成檢查。但是,如果是這樣,是否有一種方法可以將數據傳遞到sql server而不會翻倍爲16位字符?我的意思是,我們沒有在SQLAPI ++ doc中找到任何合法的方法來做到這一點,而不需要SASting。我們不希望在整個項目中將SASTring設置爲8位,只是爲了描述插入問題。 – xacinay

回答

0

要修復描述問題,更新到SQLAPI ++ 4.1.2(它是免費的法律的客戶,我們一樣)。 開發人員用Postgres 9.x的二進制數據修復了porblem。在SQLAPI ++ 4.1.2版本中。

相關問題