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