Usando PostgreSQL 8.4, ¿cómo convertir bytea a valor de texto en postgres?

15

En mi aplicación inserto datos en la base de datos usando el código C, ya que las cadenas que recibo de una fuente no confiable los escapé usando la PQescapeByteaConnbiblioteca libpq. Que funciona perfectamente bien, es decir, da como resultado la cadena de formato Octet. Ver ejemplo a continuación,

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

Cadena de salida: \\012\\011\\014\\010pkjlmestPrepared

La cadena de salida se inserta en la base de datos. Ahora recupero esos datos de la base de datos en un código Java usando JDBC. ¿Cómo puedo recuperar la cadena a su valor original?

Pensé en dos posibles enfoques,

  1. Cambie la consulta de recuperación de la base de datos y pase este campo a cualquier función de manipulación de cadenas de postgres, es decir, que pueda convertir bytea en texto.
  2. Hacer la decodificación en código Java.

Puedo entender que el enfoque 1 será más eficiente. He probado casi todas las funciones enumeradas aquí, pero nada funciona. ¡¡Por favor ayuda!!

Estoy usando la versión 8.4 de postgres en una máquina Linux.

Amit
fuente
2
Se supone que el controlador JDBC decodifica bytea. ¿Qué tiene de malo ResultSet.getBytes()?
Daniel Vérité
@ DanielVérité Lo intentaré y le haré saber sobre eso
Amit

Respuestas:

8

¿Has probado encode(data bytea, format text)con el escapeformato? En esa sintaxis formatpuede ser cualquiera de estos,

  • base64
  • maleficio
  • escapar

Entonces encode(E'123\\000456'::bytea, 'hex')generará el bytea como codificado en hexadecimal.

valgog
fuente
Esto debería ser un comentario sobre la pregunta, a menos que esté seguro de que resuelve el problema. Si resuelve el problema, ¿puede explicar por qué y cómo funciona esto en beneficio de los futuros lectores?
Max Vernon
@Valgog Ya lo he intentado ...
Amit
6

La conversión de BYTEA a TEXTO requiere que conozca la codificación interna del texto. Sin conocer la codificación, no hay nada que puedas hacer. En una textcolumna normal , la base de datos almacena el texto como SERVER_ENCODINGse establece como. Por ejemplo, en su ejemplo \nse traduce a \012. Bueno, eso es una propiedad de codificación. No es objetivamente cierto para el universo.

Si conoces esa codificación, es simple sin embargo ...

  1. Tomamos su cadena de entrada como un literal codificado.
  2. Nos encodeella. Esto produce una cadena de escape (tipo text).
  3. Luego tenemos que decodificarlo de nuevo para obtener un tipo de bytea.
  4. Ahora tener un byteano nos permite volver a text. Tenemos que decirle qué formato de texto byteaestá usando convert_from. Le decimos UTF-8.

Aquí hay un ejemplo.

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
fuente
4

Para los seguidores, ya que esta parece ser la pregunta canónica para "convertir bytea a texto" (es decir, realmente puede verlo en pgAdmin, etc.). Aquí se explica cómo hacerlo visible:

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

rogerdpack
fuente