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 PQescapeByteaConn
biblioteca 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,
- 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.
- 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.
ResultSet.getBytes()
?Respuestas:
¿Has probado
encode(data bytea, format text)
con elescape
formato? En esa sintaxisformat
puede ser cualquiera de estos,Entonces
encode(E'123\\000456'::bytea, 'hex')
generará el bytea como codificado en hexadecimal.fuente
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
text
columna normal , la base de datos almacena el texto comoSERVER_ENCODING
se establece como. Por ejemplo, en su ejemplo\n
se 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 ...
encode
ella. Esto produce una cadena de escape (tipotext
).bytea
.bytea
no nos permite volver atext
. Tenemos que decirle qué formato de textobytea
está usandoconvert_from
. Le decimos UTF-8.Aquí hay un ejemplo.
fuente
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
fuente