Postgres - 解码特殊字符



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

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

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

我得到:

"ciza361a"

我能做什么?我试图设置set client_encoding to 'UTF-8';但没有运气

编码结果为 63697A61F161

"编码"如何?我认为您关心将文本编码与二进制数据的表示格式混淆。

63697A61F161是文本"cizaña"的 ISO-8859-1("拉丁语-1"(编码,二进制表示为十六进制八位字节。

如果bytea_encodinghex,则decode('63697A61F161', 'hex')生成 bytea 值'x63697A61F161' 或如果bytea_encodingescape则产生'ciza361a'。无论哪种方式,它都是二进制字符串的表示形式,而不是文本。

如果需要文本,则必须将文本编码解码为当前数据库文本convert_from编码

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

这应该有助于解释:

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

看?'ciza361a'是文本"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 二进制对象之间转换。以文本形式输出以供显示.h 这里的编码/解码是二进制表示之一,例如十六进制或 base64。

convert_fromconvert_to获取二进制数据并应用文本编码处理,以将其与本地本机数据库文本编码进行转换,从而生成文本字符串。此处的编码是文本编码。

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

最新更新