如何将PostgreSQL转义bytea转换为十六进制bytea?

时间:2014-04-28 13:22:41

标签: postgresql byte-order-mark

我得到answer来检查PostgreSQL文本列中的某个BOM。我真正喜欢的是拥有更通用的东西,比如

select decode(replace(textColumn, '\\', '\\\\'), 'escape') from tableXY;

UTF8 BOM的结果是:

\357\273\277

哪个是八进制bytea,可以通过在pgadmin中切换bytea的输出来转换:

update pg_settings set setting = 'hex' WHERE name = 'bytea_output';
select '\357\273\277'::bytea

结果是:

\xefbbbf

我希望将此结果作为一个查询,例如

update pg_settings set setting = 'hex' WHERE name = 'bytea_output';
select decode(replace(textColumn, '\\', '\\\\'), 'escape') from tableXY;

但这并不奏效。结果为空,可能是因为解码无法处理十六进制输出。

2 个答案:

答案 0 :(得分:2)

如果最终目的是获取textColumn中构成字符串的所有字节的十六进制表示,则可以使用以下命令:

SELECT encode(convert_to(textColumn, 'UTF-8'), 'hex') from tableXY;

它不依赖bytea_output。顺便说一句,此设置仅在查询的最后阶段起作用,此时结果列的类型为bytea,并且必须以文本格式返回给客户端(这是最常见的情况,以及pgAdmin一样)。这是一个表示问题,表示的实际(字节序列)是相同的。

在上面的查询中,结果是text类型,所以这无关紧要。

我认为您使用decode(..., 'escape')的查询无法正常工作,因为该参数应该以{{1​​}}格式进行编码,并且根据评论它不是普通的xml字符串。

答案 1 :(得分:1)

在Daniel-Vérité的帮助下,我现在使用这个通用查询来检查所有类型的BOM或unicode char问题:

select encode(textColumn::bytea, 'hex'), * from tableXY;

我遇到了pgAdmin和列太长的问题,因为它们没有结果。我使用了pgAdmin的查询:

select encode(substr(textColumn,1,100)::bytea, 'hex'), * from tableXY;

谢谢丹尼尔!