PQescapeByteaConn() funktioniert mit Postgres 9.0 nicht mehr (stabil) wie erwartet

Mit Umstellung auf Postgres 9.0 trat bei unseren Anwendungen das Problem auf, daß Werte in Spalten vom Typ bytea wegen fehlerhafter Escape-Kodierung (mittels PQescapeByteaConn() erzeugt) nicht mehr geschrieben werden konnten. Ich konnte das Problem nachvollziehen und es ließ sich darauf zurückführen, daß die Anwendung noch die 8.3 Client-Libs benutzte, welche verständlicherweise noch nach dem alten Format “escapten”. Nach Verwendung des 9.0er Clients wurde dann korrekt mit E\ vorangestellt, die Daten ließen sich korrekt einfügen.

Eine Woche später gelingt es aber wieder nicht (gleiche Datenbank, gleicher Rechner, gleiche Client-Lib), es kommt die gleiche Fehlermeldung und es ist zu erkennen, daß PQescapeByteaConn() jetzt wieder Sequenzen beginnend mit \ (ohne E) erzeugt. Hat jemand eine Erklärung für dieses nicht-deterministische Verhalten oder besser noch eine Lösung dafür? Vielen Dank für eure Mühe.

In 9.0 wurde das Format geändert mit dem bytea Daten übertragen werden.

Dies kann aber wieder auf das alte Verhalten zurückgestellt werden:

Release notes: PostgreSQL: Documentation: Manuals: PostgreSQL 9: Release 9.0
Config: PostgreSQL: Documentation: Manuals: PostgreSQL 9: Client Connection Defaults

ACK, böse Falle das, hab ich gestern gemerkt: $kunde hatte Texte als BYTEA gespeichert und diese so direkt auf seiner Website ausgegeben. Der Lesbarkeit tat das nicht sonderlich gut …

Andreas

Ich hatte mit diesem Parameter auf dem Server experimentiert. Das beeindruckt den Client allerdings nicht, er bleibt dabei falsch zu escapen und der Server lehnt die Daten weiterhin ab. Es geht im konkreten Fall darum die Binärdaten in ein SQL-Statement einzubetten, das Ganze passiert in sqlApi.

Die Umstellung des Parameter auf “hex” hat leider auch eine unangenehme Nebenwirkung. Sobald man in pgAdmin den Serverstatus öffnet und die Logs anzeigen lässt produziert das Tool im ein gestellten Abfragetakt einen Fehler-Requester, auf dem Server steht dazu:

2010-12-02 16:58:57 CET FEHLER: ungültige Byte-Sequenz für Kodierung »UTF8«: 0xc3
2010-12-02 16:58:57 CET ANWEISUNG: SELECT pg_file_read(‘pg_log/postgresql-2010-12-02_130904.log’, 2050000, 50000)

Dieser Parameter wird also nicht vollständig vom Server bzw. pdAdmin unterstützt.