我有这样的编码词:"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_encoding
hex
,则decode('63697A61F161', 'hex')
生成 bytea 值'x63697A61F161
' 或如果bytea_encoding
escape
则产生'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)
所以:
decode
和encode
二进制数据的文本字符串表示形式与bytea
文字 Postgres 二进制对象之间转换。以文本形式输出以供显示.h 这里的编码/解码是二进制表示之一,例如十六进制或 base64。
convert_from
和convert_to
获取二进制数据并应用文本编码处理,以将其与本地本机数据库文本编码进行转换,从而生成文本字符串。此处的编码是文本编码。
它。。。一开始不容易跟上。您可能需要了解有关文本编码的更多信息。