Literały łańcuchów i znaki ucieczki w postgresql

Próba Wstawienia znaku escape do tabeli powoduje wyświetlenie Ostrzeżenia.

Na przykład:

create table EscapeTest (text varchar(50));

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

Wyświetla ostrzeżenie:

WARNING:  nonstandard use of escape in a string literal

(Korzystanie z PSQL 8.2)

Ktoś wie jak to obejść?
Author: Damjan Pavlica, 2008-08-04

5 answers

Częściowo. Tekst jest wstawiany, ale ostrzeżenie jest nadal generowane.

Znalazłem dyskusję, która wskazywała, że tekst powinien być poprzedzony "E", jako taki:

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

To stłumiło Ostrzeżenie, ale tekst nadal nie był zwracany poprawnie. Kiedy dodałem dodatkowe ukośnik, jak sugerował Michael, zadziałało.

Jako takie:

insert into EscapeTest (text) values (E'This is the first part \\n And this is the second');
 109
Author: rjohnston,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-03-04 23:08:11

Fajne.

Znalazłem również dokumentację dotyczącą E:

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

PostgreSQL akceptuje również stałe łańcuchowe typu "escape", które są rozszerzeniem standardu SQL. Stała escape string jest określana przez zapisanie litery E (Wielkiej lub małej litery) tuż przed otwierającym pojedynczym cudzysłowem, np. E 'Foo'. (Kontynuując ciąg znaków specjalnych w liniach, napisz E tylko przed pierwszym cytatem otwierającym.) W ciągu escape znak ukośnika ( \ ) rozpoczyna sekwencję ucieczki ukośnika w stylu C, w której kombinacja ukośnika i następujących znaków reprezentuje specjalną wartość bajtu. \b to backspace, \ f to kanał formularza, \n to znak nowej linii, \ r to powrót karetki, \t to tabulator. Obsługiwane są również \cyfry, gdzie cyfry reprezentują wartość bajtu ósemkowego, oraz \xhexdigits, gdzie heksadecymalna wartość bajtu szesnastkowego. (Twoim obowiązkiem jest tworzone sekwencje bajtów są poprawnymi znakami w kodowaniu zestawu znaków serwera.) Każdy inny znak po odwrotnym ukośniku jest brany dosłownie. Tak więc, aby dołączyć znak odwróconego ukośnika, napisz dwa ukośniki (\\). Ponadto, pojedynczy cudzysłów może być zawarty w łańcuchu escape poprzez napis \', oprócz normalnego sposobu".

 32
Author: Michael Stum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-08-04 01:14:57

Ostrzeżenie jest wydawane, ponieważ używasz ukośników wstecznych w ciągach. Jeśli chcesz uniknąć wiadomości, wpisz to polecenie " set standard_conforming_strings = on;". Następnie użyj "E" przed ciągiem, w tym ukośników wstecznych, które chcesz intrepretować postgresql.

 5
Author: eppesuig,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-02-16 23:51:23

Bardzo mało prawdopodobne jest, aby Postgres obciął Twoje dane na wejściu - albo je odrzuca, albo przechowuje tak, jak jest.

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=>
 3
Author: Milen A. Radev,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-27 16:04:29

Naprawdę głupie pytanie: czy jesteś pewien, że ciąg jest obcinany, a nie tylko łamany przy podanym linebreaku(i prawdopodobnie nie pokazuje się w interfejsie)? Ie, czy spodziewasz się, że pole będzie wyświetlane jako

To zostanie wstawione \N to nie będzie be

LUB

To zostanie wstawione

To nie będzie

Również, jakiego interfejsu używasz? Czy to możliwe, że coś po drodze zjada Twoje ukośniki?

 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-09-16 13:26:04