我得到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;
但这并不奏效。结果为空,可能是因为解码无法处理十六进制输出。
答案 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;
谢谢丹尼尔!