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 PQescapeByteaConn
der 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,
- Ändern Sie die Datenbankabrufabfrage und übergeben Sie dieses Feld an eine beliebige String-Manipulationsfunktion von Postgres, die Bytea in Text konvertieren kann.
- 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.
ResultSet.getBytes()
?Antworten:
Hast du das
encode(data bytea, format text)
mitescape
format probiert . In dieser Syntaxformat
kann jede dieser sein,So
encode(E'123\\000456'::bytea, 'hex')
wird das Byte als hexadezimal codiert ausgegeben.quelle
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
text
Spalte speichert die Datenbank den Text soSERVER_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 ..
encode
es. Dies erzeugt einen maskierten String (Typtext
).bytea
.bytea
, dürfen wir nicht mehr zurücktext
. Wir müssen ihm sagen, welches Textformat verwendetbytea
wirdconvert_from
. Wir sagen es UTF-8.Hier ist ein Beispiel.
quelle
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
quelle