Vă mulțumim pentru susținere

String literali și caractere de escape în postgresql

Încercarea de a insera un caracter de evacuare într-un tabel duce la un avertisment.

De exemplu:

create table EscapeTest (text varchar(50));

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

Produce avertizarea:

WARNING:  nonstandard use of escape in a string literal

( Utilizarea PSQL 8.2 )

Oricine știe cum să treacă prin asta?

0
adăugat editat

4 răspunsuri

Misto.

De asemenea, am găsit documentația referitoare la E:

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

PostgreSQL acceptă, de asemenea, constante șir "escape", care reprezintă o extensie la standardul SQL. O constantă a șirului de evacuare este specificată prin scrierea literei E (cu majuscule sau cu majuscule) chiar înainte de citarea unică de deschidere, de ex. E'foo“. (Atunci când continuați o constantă șir de evacuare în linie, scrieți E numai înainte de prima citare de deschidere.) Într-un șir de evacuare, un caracter invers (\) începe o secvență de evadare ca înapoi, în care combinația lunetei și următorul caracter ( s) reprezintă o valoare octeală specială. \ b este un spațiu de backspace, \ f este un feed, \ n este un rând nou, \ r este o retur de carriage, \ t este o filă. De asemenea, sunt acceptate \ cifre, unde cifrele reprezintă o valoare octală octeală și \ xhexdigits, unde hexdigiți reprezintă o valoare byte hexazecimală. (Este responsabilitatea ta ca secvențele de octeți pe care le creezi să fie caractere valide în codificarea setului de caractere al serverelor.) Orice alt caracter urmând o backslash este luat literal. Astfel, pentru a include un caracter invers, scrieți două spate (\\). De asemenea, o singură citare poate fi inclusă într-un șir de evacuare scriind \ ', pe lângă modul normal de' '.

0
adăugat

Parţial. Textul este introdus, dar avertismentul este încă generat.

Am găsit o discuție care a indicat că textul trebuie precedat cu "E", ca atare:

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

Acest lucru a suprimat avertismentul, dar textul nu a fost încă returnat corect. Când am adăugat slash-ul suplimentar așa cum mi-a sugerat Michael, a funcționat.

Ca atare:

insert into EscapeTest (text) values (E'This is the first part \\n And this is the second');
0
adăugat
Rețineți că în PostgreSQL 9.0 E'testing \\ x20double-slash "va fi evaluat ca" testarea \\ x20double-slash ", deci doar abordarea cu o singură slash funcționează pentru literalurile stilului E'string
adăugat autor Alexander
adăugat autor Pitt
psql \ copy Notă: Am constatat că E '\ n' a fost scris în fișier ca '\ n' a folosit-o în argumentul interogării meta-comanda `ps copy 'a lui psql.
adăugat autor Stew

Mi se pare foarte puțin probabil ca Postgres să taie datele dvs. pe intrare - fie o respinge, fie o stochează așa cum este.

[email protected]:~$ 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=>
0
adăugat
Încercați testul pe care l-am dat și îl veți vedea singur.
adăugat autor rjohnston
Interesant, se pare că problema a fost în driverul JDBC atunci, pentru că textul care ieșea din baza de date a fost cu siguranță trunchiat ...
adăugat autor rjohnston
Postgresul face reducerea datelor introduse în anumite situații foarte specifice. De exemplu, o coloană care variază (4) dată testului de intrare (două spații urmând cuvântul, 6 caractere) va trunchia spațiile și va stoca valoarea "test". Ca regulă generală, totuși, puteți presupune că Postgres va greși, mai degrabă decât să vă distorsioneze datele.
adăugat autor Bryson

Avertizarea se emite din moment ce folosiți spate-lămpi în șiruri de caractere. Dacă doriți să evitați mesajul, tastați această comandă "set standard_conforming_strings = on;". Apoi folosiți "E" înainte de șirul dvs., inclusiv backslash-urile pe care doriți să le interpretați postgresql.

0
adăugat
M-am referit la șiruri de caractere din instrucțiunile SQL, în timp ce acum folosiți o comandă psql. Ai aceeasi eroare folosind comanda COPY in loc de \ copy?
adăugat autor eppesuig
Acesta este răspunsul potrivit. Versiunile moderne ale PG acum sunt implicite pentru a avea pe ea.
adăugat autor jpmc26