Domanda

Il tentativo di inserire un carattere di escape in una tabella genera un avviso.

Per esempio:

create table EscapeTest (text varchar(50));

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

Produce l'avviso:

WARNING:  nonstandard use of escape in a string literal

(Utilizzando PSQL 8.2)

Qualcuno sa come aggirare questo problema?

È stato utile?

Soluzione

Parzialmente.Il testo viene inserito, ma l'avviso viene comunque generato.

Ho trovato una discussione che indicava che il testo doveva essere preceduto da "E", in quanto tale:

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

Ciò ha eliminato l'avviso, ma il testo non veniva ancora restituito correttamente.Quando ho aggiunto la barra aggiuntiva come suggerito da Michael, ha funzionato.

Come tale:

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

Altri suggerimenti

Freddo.

Ho trovato anche la documentazione riguardante la E:

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

PostgreSQL accetta anche costanti stringa "escape", che sono un'estensione dello standard SQL.Una costante di stringa di escape viene specificata scrivendo la lettera E (maiuscola o minuscola) subito prima della virgoletta singola di apertura, ad es.E'foo'.(Quando si continua una costante di stringa di escape su più righe, scrivere E solo prima della prima virgoletta di apertura.) All'interno di una stringa di escape, un carattere barra rovesciata (\) inizia una sequenza di escape barra rovesciata simile a C, in cui la combinazione di barra rovesciata e carattere successivo ( s) rappresenta un valore di byte speciale.\b è un backspace, \f è un avanzamento modulo, è una nuova riga, è un ritorno a capo, è una tabulazione.Sono supportati anche \digits, dove digits rappresenta un valore di byte ottale, e \xhexdigits, dove hexdigits rappresenta un valore di byte esadecimale.(È tua responsabilità che le sequenze di byte che crei siano caratteri validi nella codifica del set di caratteri del server.) Qualsiasi altro carattere che segue una barra rovesciata viene preso alla lettera.Pertanto, per includere un carattere barra rovesciata, scrivere due barre rovesciate (\\).Inoltre, è possibile includere una virgoletta singola in una stringa di escape scrivendo \', oltre al normale modo di ''.

L'avviso viene emesso poiché stai utilizzando barre rovesciate nelle stringhe.Se vuoi evitare il messaggio, digita questo comando "set standard_conforming_strings=on;".Quindi usa "E" prima della stringa, incluse le barre rovesciate che vuoi che postgresql interpreti.

Trovo altamente improbabile che Postgres tronchi i tuoi dati in input: li rifiuta o li memorizza così come sono.

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

Domanda davvero stupida:Sei sicuro che la stringa venga troncata e non solo interrotta all'interruzione di riga specificata (e possibilmente non visualizzata nella tua interfaccia)?Cioè, ti aspetti che il campo venga visualizzato come

Questo verrà inserito n questo non sarà

O

Questo verrà inserito

Questo non sarà

Inoltre, che interfaccia stai utilizzando?È possibile che qualcosa lungo il percorso stia mangiando le tue barre rovesciate?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top