Wie konvertiert man mit PostgreSQL 8.4 bytea in text value in postgres?

15

In meiner Anwendung füge ich Daten mithilfe von C-Code in die Datenbank ein, da die Zeichenfolgen, die ich von einer nicht vertrauenswürdigen Quelle erhalte, mithilfe PQescapeByteaConnder libpq-Bibliothek maskiert wurden. Das funktioniert einwandfrei, dh es entsteht ein String im Oktettformat. Siehe folgendes Beispiel:

Eingabezeichenfolge: \n\t\f\b\p\k\j\l\mestPrepared

Ausgabezeichenfolge: \\012\\011\\014\\010pkjlmestPrepared

Die Ausgabezeichenfolge wird in die Datenbank eingefügt. Jetzt rufe ich diese Daten aus der Datenbank in einem Java-Code mit JDBC ab. Wie kann ich die Zeichenfolge wieder auf ihren ursprünglichen Wert zurücksetzen?

Ich dachte an zwei mögliche Ansätze,

  1. Ändern Sie die Datenbankabrufabfrage und übergeben Sie dieses Feld an eine beliebige String-Manipulationsfunktion von Postgres, die Bytea in Text konvertieren kann.
  2. Führen Sie die Dekodierung im Java-Code durch.

Ich kann verstehen, dass der Ansatz 1 effizienter sein wird. Ich habe fast alle hier aufgeführten Funktionen ausprobiert , aber nichts funktioniert. Bitte helfen Sie!

Ich verwende Version 8.4 von Postgres auf einem Linux-Computer.

Amit
quelle
2
Der JDBC-Treiber soll bytea dekodieren. Was ist los mit ResultSet.getBytes()?
Daniel Vérité
@ DanielVérité Ich werde das versuchen und Sie darüber informieren
Amit

Antworten:

8

Hast du das encode(data bytea, format text)mit escapeformat probiert . In dieser Syntax formatkann jede dieser sein,

  • base64
  • verhexen
  • Flucht

So encode(E'123\\000456'::bytea, 'hex')wird das Byte als hexadezimal codiert ausgegeben.

Valgog
quelle
Dies sollte ein Kommentar zur Frage sein, es sei denn, Sie sind sich sicher, dass das Problem dadurch behoben wird. Wenn es das Problem löst, können Sie erläutern, warum und wie dies zum Nutzen zukünftiger Leser funktioniert?
Max Vernon
@Valgog habe ich schon ausprobiert ..
Amit
6

Für die Konvertierung von BYTEA in TEXT müssen Sie die interne Kodierung des Texts kennen. Ohne die Kodierung zu kennen, gibt es nichts, was Sie tun können. In einer normalen textSpalte speichert die Datenbank den Text so SERVER_ENCODING, wie er festgelegt ist. Zum Beispiel wird in Ihrem Beispiel \nübersetzt in \012. Nun, das ist eine Eigenschaft der Kodierung. Es ist objektiv nicht wahr für das Universum.

Wenn Sie diese Codierung kennen, ist es jedoch einfach ..

  1. Wir nehmen Ihre Eingabezeichenfolge als codiertes Literal.
  2. Wir encodees. Dies erzeugt einen maskierten String (Typ text).
  3. Dann müssen wir es zurückdecodieren, um eine Art von zu erhalten bytea.
  4. Jetzt, wo wir ein haben bytea, dürfen wir nicht mehr zurück text. Wir müssen ihm sagen, welches Textformat verwendet byteawird convert_from. Wir sagen es UTF-8.

Hier ist ein Beispiel.

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

Für Follower, da dies die kanonische Frage für das "Konvertieren von Bytea in Text" zu sein scheint (dh Sie können es tatsächlich in pgAdmin usw. sehen). So machen Sie es einfach sichtbar:

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

Rogerdpack
quelle