Le stringhe letterali e caratteri di escape in PostgreSQL

voti
95

Il tentativo di inserire un carattere di escape in una tabella i risultati di un avvertimento.

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'avvertimento:

WARNING:  nonstandard use of escape in a string literal

( Usando PSQL 8.2 )

Qualcuno sa come ottenere intorno a questo?

È pubblicato 04/08/2008 alle 02:00
fonte dall'utente
In altre lingue...                            


5 risposte

voti
104

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

Ho trovato una discussione che indicava il testo doveva essere preceduto con 'E', come ad esempio:

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

Questo soppresso l'avvertimento, ma il testo non è stato ancora restituito correttamente. Quando ho aggiunto la barra aggiuntiva come Michael ha suggerito, ha funzionato.

Come tale:

insert into EscapeTest (text) values (E'This is the first part \\n And this is the second');
Risposto il 04/08/2008 a 02:07
fonte dall'utente

voti
32

Freddo.

Ho trovato anche la documentazione relativa alla E:

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

PostgreSQL accetta anche "fuga" costanti stringa, che sono un'estensione dello standard SQL. Una stringa di escape costante viene specificato scrivendo la lettera E (caso superiore o inferiore) poco prima dell'apertura apostrofo, ad esempio E'foo'. (Quando si continua una stringa di escape costante attraverso linee, scrivere E solo prima della prima citazione apertura.) Da una stringa di escape, un carattere rovesciato (\) inizia una sequenza di barra rovesciata C-simili, in cui la combinazione di barra rovesciata e carattere successivo ( s) rappresenta un valore speciale byte. \ B è un backspace, \ f è un avanzamento, \ n è una nuova riga, \ r è un ritorno, \ t è una scheda. Inoltre, sono supportate \ cifre, di cui le cifre rappresenta un valore ottale byte, e \ xhexdigits, dove hexdigits rappresenta un valore esadecimale byte. (È responsabilità che le sequenze di byte creati sono caratteri validi nella codifica set di caratteri del server.) Qualsiasi altro carattere che segue una barra inversa viene preso alla lettera. Così, per includere una barra rovesciata, scrivere due barre rovesciate (\\). Inoltre, una singola citazione può essere incluso in una stringa di escape scrivendo \', in aggiunta al normale modo di ''.

Risposto il 04/08/2008 a 02:14
fonte dall'utente

voti
5

L'avvertimento viene emesso dal momento che si sta utilizzando backslash nelle stringhe. Se si vuole evitare il messaggio, digitare il comando "set standard_conforming_strings = on;". Quindi utilizzare "E" prima della stringa tra cui backslash che si desidera PostgreSQL intrepret.

Risposto il 17/02/2010 a 00:51
fonte dall'utente

voti
3

Trovo altamente improbabile per Postgres per troncare i dati su input - esso sia rifiuta o lo memorizza come è.

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 IGNORE  0 1
milen=> select * from EscapeTest;
          text
------------------------
 This will be inserted
  This will not be
(1 row)

milen=>
Risposto il 19/09/2008 a 20:24
fonte dall'utente

voti
2

Davvero stupida domanda: Sei sicuro la stringa è troncati, e non appena rotto al linebreak specificata (e forse non mostrare nell'interfaccia)? Vale a dire, si aspetta il campo per mostrare come

Questo sarà inserita \ n Questo non sarà

o

Questo sarà inserita

Questo non sarà

Inoltre, quale interfaccia stai usando? E 'possibile che qualcosa lungo la strada è mangiare i tuoi backslash?

Risposto il 16/09/2008 a 14:26
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more