Usando o PostgreSQL 8.4, como converter bytea em valor de texto no postgres?

15

No meu aplicativo, insiro dados no banco de dados usando o código C, já que as seqüências que recebo de uma fonte não confiável os escaparam usando a PQescapeByteaConnbiblioteca libpq. O que está funcionando perfeitamente, ou seja, resulta no formato Octet String. Veja o exemplo abaixo,

String de entrada: \n\t\f\b\p\k\j\l\mestPrepared

String de saída: \\012\\011\\014\\010pkjlmestPrepared

String de saída é inserida no banco de dados. Agora, recupero esses dados do banco de dados em um código java usando JDBC. Como posso retirar a string do valor original?

Pensei em duas abordagens possíveis,

  1. Altere a consulta de recuperação do banco de dados e passe esse campo para qualquer função de manipulação de String do postgres, ou seja, que possa converter bytea em texto.
  2. Faça a decodificação no código Java.

Eu posso entender que a abordagem 1 será mais eficiente. Eu tentei quase todas as funções listadas aqui, mas nada está funcionando. Por favor ajude!!

Estou usando a versão 8.4 do postgres em uma máquina Linux.

Amit
fonte
2
O driver JDBC deve decodificar o bytea. O que há de errado ResultSet.getBytes()?
Daniel Vérité 14/11
@ DanielVérité Vou tentar isso e deixar que você sabe sobre isso
Amit

Respostas:

8

Você já tentou o encode(data bytea, format text)com escapeformato. Nessa sintaxe formatpode ser qualquer um desses,

  • base64
  • hex
  • fuga

O encode(E'123\\000456'::bytea, 'hex')resultado será o bytea como codificado em hexadecimal.

valgog
fonte
Este deve ser um comentário sobre a questão, a menos que você tenha certeza de que resolve o problema. Se resolver o problema, você pode explicar por que e como isso funciona para o benefício de futuros leitores?
Max Vernon
@ Valgog Eu já tentei isso ..
Amit
6

A conversão de BYTEA em TEXT exige que você conheça a codificação interna do texto. Sem saber a codificação, não há nada que você possa fazer. Em uma textcoluna normal , o banco de dados armazena o texto como SERVER_ENCODINGdefinido como. Por exemplo, no seu exemplo \né traduzido para \012. Bem, isso é uma propriedade de codificação. Não é objetivamente verdadeiro para o universo.

Se você conhece essa codificação, é simples.

  1. Tomamos sua string de entrada como um literal codificado.
  2. Nós encode. Isso produz uma string de escape (tipo text).
  3. Então temos que decodificá-lo de volta para obter um tipo de bytea.
  4. Agora, ter um byteanão nos permite voltar text. Temos que dizer qual formato de texto byteaestá em uso convert_from. Nós dizemos isso UTF-8.

Aqui está um exemplo.

SELECT convert_from(decode(x, 'escape'), 'UTF-8')
FROM encode(E'\n\t\f\b\p\k\j\l\mestPrepared'::bytea, 'escape')
  AS t(x);
Evan Carroll
fonte
4

Para os seguidores, já que essa parece ser a pergunta canônica para "converter bytea em texto" (ou seja, para que você possa vê-lo no pgAdmin etc.). Veja como obtê-lo visível:

select encode(table.your_column_name, 'escape') as name from table_name

rogerdpack
fonte