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 PQescapeByteaConn
biblioteca 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,
- 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.
- 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.
ResultSet.getBytes()
?Respostas:
Você já tentou o
encode(data bytea, format text)
comescape
formato. Nessa sintaxeformat
pode ser qualquer um desses,O
encode(E'123\\000456'::bytea, 'hex')
resultado será o bytea como codificado em hexadecimal.fonte
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
text
coluna normal , o banco de dados armazena o texto comoSERVER_ENCODING
definido 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.
encode
. Isso produz uma string de escape (tipotext
).bytea
.bytea
não nos permite voltartext
. Temos que dizer qual formato de textobytea
está em usoconvert_from
. Nós dizemos isso UTF-8.Aqui está um exemplo.
fonte
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
fonte