Frage

Der Versuch, ein Escape-Zeichen in eine Tabelle einzufügen, führt zu einer Warnung.

Zum Beispiel:

create table EscapeTest (text varchar(50));

insert into EscapeTest (text) values ('This is the first part \n And this is the second');

Erzeugt die Warnung:

WARNING:  nonstandard use of escape in a string literal

(Verwendung von PSQL 8.2)

Weiß jemand, wie man das umgehen kann?

War es hilfreich?

Lösung

Teilweise.Der Text wird eingefügt, die Warnung wird jedoch weiterhin generiert.

Ich habe eine Diskussion gefunden, die darauf hindeutet, dass dem Text ein „E“ vorangestellt werden muss:

insert into EscapeTest (text) values (E'This is the first part \n And this is the second');

Dadurch wurde die Warnung unterdrückt, der Text wurde jedoch immer noch nicht korrekt zurückgegeben.Als ich den zusätzlichen Schrägstrich einfügte, wie Michael es vorgeschlagen hatte, funktionierte es.

Als solche:

insert into EscapeTest (text) values (E'This is the first part \\n And this is the second');

Andere Tipps

Cool.

Ich habe auch die Dokumentation zum E gefunden:

http://www.postgresql.org/docs/8.3/interactive/sql-syntax-lexical.html#SQL-SYNTAX-STRINGS

PostgreSQL akzeptiert auch „Escape“-String-Konstanten, die eine Erweiterung des SQL-Standards darstellen.Eine Escape-String-Konstante wird angegeben, indem der Buchstabe E (Groß- oder Kleinschreibung) direkt vor das öffnende einfache Anführungszeichen geschrieben wird, z. B.E'foo'.(Wenn Sie eine Escape-Zeichenfolge über mehrere Zeilen hinweg fortsetzen, schreiben Sie E nur vor dem ersten öffnenden Anführungszeichen.) Innerhalb einer Escape-Zeichenfolge beginnt ein Backslash-Zeichen (\) eine C-ähnliche Backslash-Escape-Sequenz, in der die Kombination aus Backslash und folgendem Zeichen( s) stellt einen speziellen Bytewert dar.\b ist eine Rücktaste, \f ist ein Seitenvorschub, ist ein Zeilenumbruch, ist ein Wagenrücklauf, ist ein Tabulator.Unterstützt werden auch \digits, wobei digits einen oktalen Bytewert darstellt, und \xhexdigits, wobei hexdigits einen hexadezimalen Bytewert darstellt.(Es liegt in Ihrer Verantwortung, dass die von Ihnen erstellten Bytesequenzen gültige Zeichen in der Zeichensatzkodierung des Servers sind.) Alle anderen Zeichen, die auf einen Backslash folgen, werden wörtlich genommen.Um ein Backslash-Zeichen einzufügen, schreiben Sie also zwei Backslashes (\\).Außerdem kann ein einfaches Anführungszeichen in eine Escape-Zeichenfolge eingefügt werden, indem man zusätzlich zur normalen Schreibweise „“ schreibt.

Die Warnung wird ausgegeben, da Sie in Ihren Zeichenfolgen Backslashes verwenden.Wenn Sie die Meldung vermeiden möchten, geben Sie den Befehl „set standard_conforming_strings=on;“ ein.Verwenden Sie dann „E“ vor Ihrer Zeichenfolge, einschließlich der Backslashes, die Postgresql interpretieren soll.

Ich halte es für höchst unwahrscheinlich, dass Postgres Ihre Daten bei der Eingabe abschneidet – es lehnt sie entweder ab oder speichert sie unverändert.

milen@dev:~$ psql
Welcome to psql 8.2.7, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

milen=> create table EscapeTest (text varchar(50));
CREATE TABLE
milen=> insert into EscapeTest (text) values ('This will be inserted \n This will not be');
WARNING:  nonstandard use of escape in a string literal
LINE 1: insert into EscapeTest (text) values ('This will be inserted...
                                              ^
HINT:  Use the escape string syntax for escapes, e.g., E'\r\n'.
INSERT 0 1
milen=> select * from EscapeTest;
          text
------------------------
 This will be inserted
  This will not be
(1 row)

milen=>

Wirklich dumme Frage:Sind Sie sicher, dass die Zeichenfolge abgeschnitten und nicht nur an dem von Ihnen angegebenen Zeilenumbruch unterbrochen wird (und möglicherweise nicht in Ihrer Benutzeroberfläche angezeigt wird)?Dh, erwarten Sie, dass das Feld als angezeigt wird?

Dies wird eingefügt n Dies wird nicht sein

oder

Dies wird eingefügt

Das wird nicht sein

Und welche Schnittstelle verwenden Sie?Ist es möglich, dass etwas auf dem Weg Ihre Backslashes frisst?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top