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

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


person rjohnston    schedule 04.08.2008    source источник


Ответы (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');
person rjohnston    schedule 04.08.2008
comment
Обратите внимание, что в PostgreSQL 9.0 E'testing\\x20double-slash' будет оцениваться как 'testing\\x20double-slash', поэтому для литералов стиля E'string' работает только подход с одинарной косой чертой. - person Alexander; 14.08.2012
comment
Для PostgreSQL 9.2 см.: postgresql .org/docs/9.2/interactive/ - person Pitt; 16.11.2012
comment
psql \copy примечание: я обнаружил, что E'\n' был записан в файл как '\n', а не как новая строка, когда я использовал его в аргументе запроса для метакоманды psql `\copy'. - person Stew; 31.12.2015

Прохладный.

Я также нашел документацию по E:

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

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

person Michael Stum    schedule 04.08.2008

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

person eppesuig    schedule 16.02.2010
comment
Не совсем. Если у меня стандартные_конформные_строки=включены, и я запускаю команду \copy xxxxxxxxxxx FROM /support01/db/data/xxxxxxxxx_7F.txt DELIMITER AS E'\x7f', я получаю parse error at "'\x7f'". Если у меня есть стандартное_соответствие_стрингов = выкл; и используйте ту же команду выше без E и кавычек... ( DELIMITER AS \x7f) Я получаю предупреждающее сообщение, но данные загружаются нормально. Так что ваше утверждение может быть правильным, но не в этом случае. - person ; 10.02.2011
comment
Я имел в виду строки в операторах SQL, а вы сейчас используете команду psql. Вы получаете ту же ошибку, используя команду COPY вместо \copy? - person eppesuig; 17.11.2011
comment
Это правильный ответ. Современные версии PG теперь по умолчанию включают его. - person jpmc26; 03.01.2017

Я считаю крайне маловероятным, что 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=>
person Milen A. Radev    schedule 19.09.2008
comment
Пожалуйста, попробуйте тестовый пример, который я дал, и вы убедитесь в этом сами. - person rjohnston; 22.09.2008
comment
Интересно, похоже, что тогда проблема была в драйвере JDBC, потому что текст, выходящий из базы данных, определенно усекался... - person rjohnston; 19.01.2009
comment
Postgres делает усечение данных при вводе в некоторых очень специфических ситуациях. Например, столбец character varying(4) с заданным входным тестом (два пробела после слова, 6 символов) обрежет пробелы и сохранит значение теста. Однако, как правило, вы можете предположить, что Postgres будет ошибаться, а не усекать ваши данные. - person Bryson; 04.03.2014

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

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

or

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

Это не будет

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

person Community    schedule 16.09.2008
comment
это случилось со мной. Текст вставлялся в текстовое поле, просматривал исходник и, конечно же, была цитата и весь текст присутствовал, просто не был виден - person roberthuttinger; 31.08.2012