XML in BYTEA-Spalte

Hallo,
ich habe eine Tabelle, die in einer Spalte info vom Typ BYTEA Informationen enthält. Diese Informationen können aus diversen Quellen stammen und diverse Formen (Text, HTML, XML, …) haben. In einer weiteren Spalte status kann man erkennen, woher die Informationen stammen, und daher auf den Typ und eventuell die Kodierung schliessen. Bei Text und HTML muss man die Kodierung kennen, bei XML sollte es auch ohne diese Kenntnis gehen, da der benutzte Zeichensatz im Anfang der XML-Datei (z.B. ‘<?xml version=“n.m” encoding=“Kodierung”>’) steht.
Nun haben die XML-Daten aus der Quelle mit dem Status 150 vor einigen Jahren von ISO-8859-1 auf UTF-8 gewechselt, so das hier zwei mögliche Kodierungen auftreten, was aber kein Problem sein sollte, da die Kodierung ja in den Daten hinterlegt ist.

Bisher benutzte ich als Datenbank eine Postgres 8.3.? und die Query begann mit

SELECT info
FROM tabelle
WHERE status = 150 ...

Dann holte ich mit getString(…) den Text des Feldes ins Programm (Java) und pickte mir die gewünschten Details heraus.

Nach der Umstellung auf Postgres 9.1.9 erhalte ich jetzt mit derselben Query mit getString(…) anstelle des Textes nur noch ein ‘\x3c3f786d6c20 …’; also die HEX-kodierte Darstellung des Feld-Inhaltes. Jeder Versuch, mit Casts oder Funktionen (convert_from(…)) das alte Ergebnis zu erhalten scheitert daran, dass ich für eine Wandlung in Text die Kodierung des Inhaltes kennen müsste, was aber erst nach einer Wandlung in Text möglich ist :frowning:
Da hier der Feld-Inhalt in diesem Fall XML ist, müsste man ja eigentlich auch direkt von BYTEA in XML wandeln können, was in Postgres aber scheint’s nicht vorgesehen ist.

Ich kann mir jetzt natürlich damit helfen, mir mit getBytes(…) die Bytefolge ins Java zu holen und dann dort weiter zu verarbeiten, aber irgendwie müsste doch auch eine Verarbeitung in SQL möglich sein. Entweder über eine(n) Funktion/Cast die/den ich übersehen habe oder über eine fehlertolerante Wandlung in Text, die falsch kodierte Zeichen z.B. in Fragezeichen wandelt.

Habt Ihr da eine sinnvolle Idee?

mfg Volker

Das Ausgabeformat von Bytea hat siche mit 9.x geändert. Deine Lösung ist trivial: “alter database set bytea_output = ‘escape’;”

Mit version 9.0 wurde das umgestellt (Siehe hier: http://www.postgresql.org/docs/9.0/static/release-9-0.html#AEN100866)

Vermutlich verwendest Du auch noch einen alten JDBC Treiber und nicht den, der zur 9.x gehört.

Umstellen kann man das Verhalten mit dem Config Parameter bytea_output
Details dazu sind im Handbuch zu finden: http://www.postgresql.org/docs/9.1/static/runtime-config-client.html#GUC-BYTEA-OUTPUT