postgresql - Postgres - 解码特殊字符

标签 postgresql

我有这样编码的词:“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_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 获取二进制数据并应用文本编码处理将其与本地 native 数据库文本编码相互转换,从而生成文本字符串。这里的编码是文本编码。

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

关于postgresql - Postgres - 解码特殊字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45594383/

相关文章:

mongodb - 如何从postgres中的mongodb objectid中提取时间戳

ruby-on-rails - 如何在我的代码库中忽略/抑制特定类型的异常(ActiveRecord::ReadOnlyRecord)

ruby-on-rails - 计算 rails update 中 created_at 和 now() 之间的差异

postgresql - 在 Amazon ec2 linux 上更改 postgresql 9.3 数据库位置

postgresql - Postgres - 查询一对多关系

php - PostgreSQL:唯一违反:7 错误:重复键值违反唯一约束 "users_pkey"

postgresql - 在 Postgres 中重命名 nextval ('...' )

sql - 如何动态查询列名?

Node.js、Express 和 Postgres 设计

sql查找具有特定类型的电影