Utilizzando PostgreSQL 8.4, come convertire bytea in valore di testo in Postgres?


15

Nella mia applicazione inserisco i dati nel database usando il codice C, poiché le stringhe che ricevo da una fonte non attendibile le ho salvate usando la PQescapeByteaConnlibreria libpq. Che funziona perfettamente bene, vale a dire risultati in formato Ottetto String. Vedi l'esempio seguente,

Stringa di input: \n\t\f\b\p\k\j\l\mestPrepared

Stringa di uscita: \\012\\011\\014\\010pkjlmestPrepared

La stringa di output viene inserita nel database. Ora recupero quei dati dal database in un codice Java usando JDBC. Come posso ripristinare il valore originale della stringa?

Ho pensato a due possibili approcci,

  1. Modificare la query di recupero del database e passare questo campo a qualsiasi funzione di manipolazione di stringhe di postgres, ovvero che può convertire bytea in testo.
  2. Esegui la decodifica nel codice Java.

Posso capire che l'approccio 1 sarà più efficiente. Ho provato quasi tutte le funzioni elencate qui, ma non funziona nulla. Per favore aiuto!!

Sto usando la versione 8.4 di Postgres su una macchina Linux.


2
Il driver JDBC dovrebbe decodificare bytea. Cosa c'è che non va ResultSet.getBytes()?
Daniel Vérité,

@ DanielVérité Ci proverò e ti farò sapere
Amit

Risposte:


8

Hai provato encode(data bytea, format text)con il escapeformato. In quella sintassi formatpuò esserci uno di questi,

  • Base64
  • esadecimale
  • fuga

Quindi encode(E'123\\000456'::bytea, 'hex')verrà emesso il bytea come codificato in esadecimale.


Questo dovrebbe essere un commento sulla domanda, a meno che tu non sia sicuro che risolva il problema. Se risolve il problema, puoi approfondire perché e come funziona a beneficio dei futuri lettori?
Max Vernon,

@Valgog L'ho già provato ..
Dal

6

La conversione di BYTEA in TESTO richiede la conoscenza della codifica interna del testo. Senza conoscere la codifica, non c'è niente che puoi fare. In una textcolonna normale , il database memorizza il testo come qualsiasi cosa SERVER_ENCODINGsia impostato come. Ad esempio, nel tuo esempio \nviene tradotto in \012. Bene, questa è una proprietà della codifica. Non è oggettivamente vero per l'universo.

Se conosci quella codifica, è semplice comunque ...

  1. Prendiamo la tua stringa di input come un letterale codificato.
  2. Noi encode. Questo produce una stringa di escape (tipo text).
  3. Quindi dobbiamo decodificarlo per ottenere un tipo di bytea.
  4. Ora avere un byteanon ci consente di tornare a text. Dobbiamo dirgli quale formato di testo byteaè in uso convert_from. Lo diciamo UTF-8.

Ecco un esempio

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);

4

Per i follower, dal momento che questa sembra essere la domanda canonica per "convertire bytea in testo" (cioè in modo da poterlo effettivamente vedere in pgAdmin ecc.). Ecco come visualizzarlo e basta:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.