我有这样编码的词:“cizaña”,编码结果是63697A61F161
当我再次尝试转换为“cizaña”时
select decode('63697A61F161'::text, 'hex')
我得到:
"ciza\361a"
我能做什么?我尝试设置 set client_encoding to 'UTF-8';
但没有成功
最佳答案
the encoded result is 63697A61F161
“编码”如何?我认为您关心的是将文本编码与二进制数据的表示格式混淆。
63697A61F161
是文本“cizaña”的 iso-8859-1(“latin-1”)编码,二进制表示为十六进制八位字节。
decode('63697A61F161', 'hex')
生成 bytea 值 '\x63697A61F161
' 如果 bytea_encoding
是 hex
或 'ciza\361a'
如果 bytea_encoding
是 escape
。无论哪种方式,它都是二进制字符串的表示,而不是文本。
如果你想要文本,你必须使用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)
所以:
decode
和 encode
将二进制数据的文本字符串表示形式与 bytea
文字、Postgres 二进制对象相互转换。以文本形式输出 display.h 这里的编码/解码是二进制表示之一,例如十六进制或 base64。
convert_from
和 convert_to
获取二进制数据并应用文本编码处理将其与本地 native 数据库文本编码相互转换,从而生成文本字符串。这里的编码是文本编码。
这……一开始并不容易理解。您可能需要了解有关文本编码的更多信息。
关于postgresql - Postgres - 解码特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45594383/