2014-04-28 43 views
2

我得到answer来检查PostgreSQL文本列中的某个BOM。我真正想做的是将有更多的东西一般情况下,即像如何将PostgreSQL转义bytea转换为十六进制bytea?

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

一个UTF8 BOM的结果是:

\357\273\277 

这是八进制BYTEA,可以通过切换转换BYTEA的输出中的pgAdmin:

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; 

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

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

它不依赖于bytea_output

+0

可以通过encode('\ 357 \ 273 \ 277':: bytea,'hex')'进行转换,但是我不会将它与其他查询结合使用,即'select encode (从tableXY解码(replace(textColumn,'\\','\\\\'),'escape'):: bytea,'hex');'不起作用。 – jan

+0

您可以通过告诉您的PG版本以及更多关于'show standard_conforming_strings'的结果来设置上下文吗? –

+0

另外,你是否期望这个'decode(...,'escape')'应用于任何类型的匹配特定语法的字符串或字符串? (在前一种情况下,我相信你是在错误的轨道上开始) –

回答

2

如果最终的目的是让所有的构成textColumn字符串中的字节十六进制表示,这是可以做到的。顺便说一句,这个设置仅在查询的最后阶段起作用,当结果列是bytea类型,并且必须以文本格式返回给客户端(这是最常见的情况,以及pgAdmin的做法)。这是表示的问题,表示的实际(字节序列)是相同的。

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

我认为你的查询与decode(..., 'escape')不能工作,因为参数应该被编码为escape格式,它不是,每个注释都是正常的xml字符串。

+0

就像我看到'decode(...,'escape')'查询,这个查询并不总是工作。在14起案件中,有两起起诉,看起来和我想要的完全一样。但在14个案例中,有12个查询的结果是空的。与物料清单无关,因为包含物料清单的两行结果为空,没有物料清单的2个结果和没有物料清单的其他10行也没有结果。如果我删除了编码部分,那么内部convert_to只有4个结果,即8个结果由编码转换为2和2结果丢失。 – jan

+0

不是来自uic_UIObjectConfiguration的'SELECT encode(uuio_configuration_c :: bytea,'hex')''好于您的查询?它有相同的结果,即14行中只有2个不是空的。 – jan

+0

@please显示导致“空”行的一些数据 –

1

与丹尼尔 - 维泰的很大帮助我用这个通用查询立即检查所有类型的BOM或Unicode字符的问题:

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

我曾与pgAdmin的问题太长列,因为他们有没有结果。我用pgAdmin的查询:

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

谢谢丹尼尔!

+0

请注意,空的结果几乎肯定是pgAdmin的显示问题。这里涉及的SQL函数并不知道大文本有问题。 –

+0

@DanielVérité:你说得对,其他客户端没有问题,select code(textColumn :: bytea,'hex'),* from tableXY;'' – jan