Acho que consultas postgresql idênticas emitidas por dois clientes diferentes são tratadas de maneira diferente. Especificamente, os valores de bytea são inseridos de forma diferente.
Uma consulta que demonstrou o comportamento é esta:
INSERT INTO "TestTable" ("Input") VALUES (decode('74657374', 'hex'))
74657374 é hexadecimal para 'teste'. Em um cliente, 'test' é inserido no campo "Input", seja esse campo text/varchar ou bytea. Esse é o comportamento que desejo. Em outro cliente, '\x74657374' é inserido no campo "Input", seja text/varchar ou bytea. Esta string é a representação literal postgresql dos bytes bytea do 'teste' ASCII. Mas a própria sintaxe literal sql é inserida. Eu não desejo esse comportamento.
Eu uso um único pedaço de SQL escrito à mão, o valor bytea ocorre apenas "dentro" da consulta (se a coluna "Input" tiver o tipo Text, nenhum dos literais nem a coluna receptora terá o tipo bytea), e parece improvável para mim que qualquer cliente está analisando e reconstruindo a consulta. Portanto, parece que a diferença deve estar acontecendo no servidor onde a consulta é executada. Isso significa que deve haver alguma configuração específica da conexão que está alterando o comportamento do servidor.
Alguém pode me dizer quais configurações específicas de conexão podem estar alterando esse comportamento?
Eu sei que as consultas estão realmente se comportando de maneira diferente e não é um problema de exibição etc., porque posso ver as linhas na mesma tabela com valores diferentes ('test' e '\x74657374'). Eu tentei vários métodos alternativos de manipulação de bytea, mas todos são afetados por esse problema. Para quem estiver interessado, o cliente "bom" é o pgAdminIII e o cliente "ruim" é o Ruby PG gem. Embora, pelo motivo que dei acima, acredite que deve haver algum recurso interno do postgresql que suporte esse comportamento.
Eu suspeito que a diferença é a aparência de a
bytea
dependendo da configuração atual debytea_output
:A
text
coluna realmente contém o resultado do tipo cast frombytea
totext
, que depende da configuração atual debytea_output
.A
bytea
coluna contém os quatro bytes corretos, mas é exibida de forma diferente, dependendo da configuração atual debytea_output
.