Строковые литералы и 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)

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

Ответы

Ответ 1

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

Я нашел дискуссию, в которой указывалось, что для текста должен предшествовать "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');

Ответ 2

Круто.

Я также нашел документацию относительно 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 символ обратной косой черты (\) начинается с escape-последовательности обратного слэша C-типа, в которой сочетается обратная косая черта и следующий символ ( s) представляет собой специальное значение байта. \b - это обратное пространство, \f - это форма, \n - это новая строка, \r - возврат каретки, \t - вкладка. Также поддерживаются цифры\цифры, где цифры представляют восьмеричное значение байта и \xhexdigits, где hexdigits представляет шестнадцатеричное значение байта. (Вы несете ответственность за то, что последовательности байтов, которые вы создаете, являются допустимыми символами в кодировке набора символов сервера.) Любой другой символ, следующий за обратным слэшем, воспринимается буквально. Таким образом, чтобы включить символ обратной косой черты, напишите две обратные слэши (\\). Кроме того, одиночная кавычка может быть включена в escape-строку, записывая \', в дополнение к обычным способом'.

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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

или

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

Это не будет

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