2017-08-09 48 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取二进制数据并应用文本编码处理将其转换为本地本地数据库文本编码或从本地本地数据库文本编码转换为文本字符串。这里的编码是文本编码。

一开始并不容易。您可能需要了解更多关于文本编码的信息。