Postgres - 解码特殊字符

时间:2017-08-09 15:06:53

标签: postgresql

我有像这样编码的词:“cizaña”,编码结果是63697A61F161

当我尝试再次转换为'cizaña'时

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

我明白了:

"ciza\361a"

我该怎么办?我试图设置set client_encoding to 'UTF-8';没有运气

1 个答案:

答案 0 :(得分:2)

  

编码结果为63697A61F161

“编码”怎么样?我认为你关心文本编码与二进制数据的表示格式混淆。

63697A61F161是文本“cizaña”的iso-8859-1(“latin-1”)编码,二进制表示为十六进制八位字节。

如果decode('63697A61F161', 'hex')'\x63697A61F161,则

bytea_encoding生成bytea值hex,如果'ciza\361a'bytea_encoding,则生成escape。无论哪种方式,它都是二进制字符串的表示,而不是文本。

如果您需要 text ,则必须将文本编码解码为使用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获取二进制数据并应用文本编码处理将其转换为本地本机数据库文本编码或从本地数据库文本编码转换,从而生成文本字符串。这里的编码是文本编码。

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