簡體   English   中英

無法將PostgreSQL文本列轉換為bytea

[英]Unable to convert PostgreSQL text column to bytea

在我的應用程序中,我使用帶有“ text”列的postgresql數據庫表來存儲腌制的python對象。 作為數據庫驅動程序,我使用的是psycopg2,直到現在,我僅將python字符串(不是unicode-objects)傳遞給數據庫,並從數據庫中檢索了字符串。 在我最近決定使字符串處理成為更好/正確的方法並將以下構造添加到我的DB層之前,這基本上可以正常工作:

psycopg2.extensions.register_type(psycopg2.extensions.UNICODE)
psycopg2.extensions.register_type(psycopg2.extensions.UNICODEARRAY)

這基本上在我的應用程序中的任何地方都可以正常工作,並且我現在盡可能使用unicode-objects。

但是對於這種特殊情況,如果文本列包含腌制的對象,則會帶來麻煩。 我以這種方式使其在我的測試系統中工作:

  • 檢索數據: SELECT data::bytea, params FROM mytable
  • 寫入數據: execute("UPDATE mytable SET data=%s", (psycopg2.Binary(cPickle.dumps(x)),) )

...但是不幸的是,我在生產系統中的某些列的SELECT上遇到了錯誤:

psycopg2.DataError: invalid input syntax for type bytea

當我嘗試在psql shell中運行查詢時,也會發生此錯誤。

基本上,我計划將列從“文本”轉換為“ bytea”,但是上面的錯誤也阻止了我執行此轉換。

據我所知,(當將列檢索為純python字符串時)字符串中僅包含ord(c)<= 127的字符。

問題在於,將text強制轉換為bytea並不意味着將字符串中的字節作為字節並將其組合為bytea值,而是取字符串並將其解釋為bytea類型的轉義輸入值。 這樣就行不通了,主要是因為泡菜數據中包含很多反斜杠,這是bytea專門解釋的。

嘗試以下方法:

SELECT convert_to(data, 'LATIN1') ...

這會將字符串轉換為采用LATIN1編碼的字節序列( bytea值)。 對您來說,確切的編碼無關緊要,因為它全都是ASCII(但沒有ASCII編碼)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM