[英]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.