Строковые литералы и escape-символы в postgresql

попытка вставить escape-символ в таблицу приводит к появлению предупреждения.

например:

create table EscapeTest (text varchar(50));

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

выдает предупреждение:

WARNING:  nonstandard use of escape in a string literal

(использование PSQL 8.2)

кто-нибудь знает как обойти это?

5 ответов


частично. Текст вставлен, но предупреждение по-прежнему генерируется.

Я нашел обсуждение, в котором указывалось, что текст должен предшествовать "E", как таковой:

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

это подавило предупреждение, но текст все еще возвращался неправильно. Когда я добавил дополнительную косую черту, как предложил Майкл, это сработало.

такие как:

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

прохладный.

Я также нашел документацию, касающуюся E:

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

PostgreSQL также принимает строковые константы "escape", которые являются расширением стандарта SQL. Константа escape-строки задается путем написания буквы E (верхний или нижний регистр) непосредственно перед открывающей одинарной кавычкой, например E'Foo. (При продолжении escape-строки константа через строки, напишите E только перед первой открывающей цитатой.) В escape-строке символ обратной косой черты ( \ ) начинает c-подобную escape-последовательность обратной косой черты, в которой комбинация обратной косой черты и следующих символов представляет специальное байтовое значение. \b-обратное пространство, \f-канал формы, \n-новая строка, \r-возврат каретки, \t-вкладка. Также поддерживаются \digits, где digits представляет восьмеричное байтовое значение, и \xhexdigits, где hexdigits представляет шестнадцатеричное байтовое значение. (Вы несете ответственность за то, что создаваемые вами последовательности байтов являются допустимыми символами в кодировке набора символов сервера.) Любой другой символ, следующий за обратной косой чертой, воспринимается буквально. Таким образом, чтобы включить символ обратной косой черты, напишите две обратные косые черты (\\). Кроме того, одна цитата может быть включена в escape-строку, написав\', в дополнение к обычному способу ".


предупреждение выдается, так как вы используете обратные косые черты в строках. Если вы хотите избежать сообщения, введите эту команду " set standard_conforming_strings=on;". Затем используйте " E " перед строкой, включая обратные косые черты, которые вы хотите, чтобы postgresql intrepret.


Я нахожу маловероятным, что Postgres усечет ваши данные на входе - он либо отклоняет их, либо сохраняет их как есть.

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

действительно глупый вопрос: вы уверены, что строка усекается, а не просто ломается в указанном вами linebreak (и, возможно, не отображается в вашем интерфейсе)? Т. е. вы ожидаете, что поле будет отображаться как

Это будет вставлено \n это не будет будь

или

Это будет вставлено

этого не будет

кроме того, какой интерфейс вы используете? Можно ли что-то по пути ест ваши косые черты?