Escape Warning PG 8.2

Hey Community,

derzeitig speichere ein byte array eines Bildes in einer Postgre Sql Datenbank.

Leider bekomme ich immer folgende Warnung von Postgre:

“nicht standardkonforme Verwendung von \ in Zeichenkettenkonstante”

Über die Konfigurationsdatei von Postgres konnte ich zwar die Warnung ausstellen, aber ich würde lieber dafür sorgen das diese Warnung gar nicht mehr auftritt!

Ist jemanden das Problem bekannt und kennt einen Workaround dafür?

greetz
george_c

Wie quotest du die Daten bevor diese in die Datenbank wandern?

Hast du schon mal über Prepared Statements nachgedacht?

Also das escapen der Strings mache ich wie folgt:

fileData2 += escape_binary(((const unsigned char*)&data));

Und über Prepared Statements habe ich auch schon einmal nachgedacht jedoch bin ich davon wieder abgekommen da ich, wie ich denke, nicht mehrere Prepared Statements gleichzeitig absenden kann. Das wäre nämlich zwingend bei dem programm da es sonst sehr viele Verbindungen zur Datenbank aufbaut und ich würde gerne so wenig SQL wie möglich senden. Bzw. halt nur ein großes SQL-Statement in diesem alle Inserts vorhanden sind.

greetz
george_c

sieht C/C++ nach PG-API /libpg aus ?! Darf man fragen warum du direkt mit der lib arbeitest und nicht ne gescheite DB-Abstraktionsschicht verwendest?

Ich vermute an dieser Stelle mal, dass die libpg vielleicht in einer nicht ganz backend-konformen version vorliegt - und es deshalb zu solchen warnings kommt … wie gesagt - ne Vermutung

Aber natürlich kann man … mehr oder minder beliebig viele - bis zum collaps der Systemressourcen :slight_smile:

Wenn du “sowenig SQL wie möglich senden” willst - sind Prepared Statements eigentlich das non+ultra … ob du mehrere Statements auf einer Connection hast - in einer Transaktion - oder verteilt bleibt ganz dir überlassen. Im Grunde gelten für derartige Statements die gleichen Regeln wie fuer herkömmliche auch.

Was bitte schön meinst du mit “gleichzeitig”?

PostgreSQL: Documentation: Manuals: PostgreSQL 8.3: Version and Platform Compatibility

escape_string_warning (boolean) When on, a warning is issued if a backslash () appears in an ordinary string literal (‘…’ syntax) and standard_conforming_strings is off. The default is on.
Applications that wish to use backslash as escape should be modified to use escape string syntax (E’…'), because the default behavior of ordinary strings will change in a future release for SQL compatibility. This variable can be enabled to help detect applications that will break.

also soll heissen - wenn du es so:

E’blablub’

escapen tun tust, sollte die warning nicht mehr auftreten …

hallo,
ich bin noch neu im Umgang mit PostgresDB und habe eine Frage.
ich bekomme die beschriebene Fehlermeldung wenn ich eine Query an meine DB schicke z.B.

SELECT * FROM table WHERE table.name ILIKE '%\\\\%'

Ich habe das mit dem Escapen noch nicht verstanden, vllt kann mir jemand das nochmal an einem Beispiel erklären? Vielen Dank im Voraus!



test=*# create table escape (name text);
CREATE TABLE
test=*# select * from escape where name ILIKE '%\\\\%';
WARNING:  nonstandard use of \\ in a string literal
LINE 1: select * from escape where name ILIKE '%\\\\%';
                                              ^
HINT:  Use the escape string syntax for backslashes, e.g., E'\\'.
 name
------
(0 rows)

test=*# select * from escape where name ILIKE E'%\\\\%';
 name
------
(0 rows)

Wenn man die Fehlermeldung nun in Google einkippt passiert dies:

Let me google that for you

Die Links dort dann erklären Dir weitere Details.


Andreas

Was an symbiont seinem Beispiel und dem Link ist denn unverständlich?

Hallo,
danke für die Hilfe hab mich ein wenig dumm angestellt. Ich hätte mal noch eine Frage:

Applications that wish to use backslash as escape should be modified to use escape string syntax (E'...'), because the default behavior of ordinary strings will change in a future release for SQL compatibility. This variable can be enabled to help detect applications that will break.

Wenn ich zum Beispiel eine Url in einer Spalte speichern möchte kommt der gleiche Fehler.Allerdings möchte ich ja nichts escapen. Dies lässt sich nur durch abstellen der Warnung ändern oder versteh ich da etwas falsch? Viele Grüße

Soweit ich das verstanden habe, musst Du nur “standard_conforming_strings=on” einschalten, damit ein Backslash nicht als “escape” interpretiert wird.

Siehe
http://www.postgresql.org/docs/8.4/static/runtime-config-compatible.html#GUC-STANDARD-CONFORMING-STRINGS