2017-08-09 103 views
1

我有這樣的編碼字: 「cizaña」,編碼的結果是63697A61F161Postgres的 - 解碼特殊字符

當我嘗試轉換爲 'cizaña' 再次

select decode('63697A61F161'::text, 'hex') 

我得到:

"ciza\361a" 

我該怎麼辦?我試圖設置set client_encoding to 'UTF-8';沒有運氣

回答

2

編碼的結果是63697A61F161

「編碼」 怎麼樣?我認爲你關心文本編碼與二進制數據表示格式的混淆。

63697A61F161是文本「cizaña」的iso-8859-1(「latin-1」)編碼,二進制表示爲十六進制八位組。

decode('63697A61F161', 'hex')產生BYTEA值'\x63697A61F161'如果bytea_encodinghex'ciza\361a'如果bytea_encodingescape。無論哪種方式,它都是二進制字符串的表示,而不是文本。

如果你想文本,你必須文本編碼convert_from,例如解碼到當前數據庫的文本編碼

test=> select convert_from(decode('63697A61F161', 'hex'), 'iso-8859-1'); 
convert_from 
-------------- 
cizaña 
(1 row) 

這應該有助於解釋:

demo=> select convert_from(BYTEA 'ciza\361a', 'iso-8859-1'); 
convert_from 
-------------- 
cizaña 
(1 row) 

看到了嗎? 'ciza\361a'是文本'cizaña'的iso-8859-1編碼的二進制數據的八進制轉義表示。這是完全相同的值作爲BYTEA十六進制格式值'\x63697A61F161'

demo=> select convert_from(BYTEA '\x63697A61F161', 'iso-8859-1'); 
convert_from 
-------------- 
cizaña 
(1 row) 

所以:

decodeencode轉換二進制數據和從bytea文字,Postgres的二進制對象的文本字符串表示。其以文本形式輸出用於display.h。這裏的編碼/解碼是二進制表示之一,例如,十六進制或base64。

convert_fromconvert_to取二進制數據並應用文本編碼處理將其轉換爲本地本地數據庫文本編碼或從本地本地數據庫文本編碼轉換爲文本字符串。這裏的編碼是文本編碼。

一開始並不容易。您可能需要了解更多關於文本編碼的信息。