Î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?
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');
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' '.
Întrebare cu adevărat stupidă: Sunteți sigur că șirul este trunchiat și nu doar rupt la linia pe care o specificați (și, eventual, nu se va afișa în interfața dvs.)? De exemplu, vă așteptați ca câmpul să apară ca
Va fi inserat \ n Acest lucru nu va fi fie
sau
Acesta va fi inserat
Aceasta nu va fi
De asemenea, ce interfață folosiți? Este posibil ca ceva de-a lungul drumului să vă mănânce spatele?
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=>
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.