Строковые литералы и экранирующие символы в 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 )

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

4.08.2008 01:00:24
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');
125
4.03.2010 23:08:11
Обратите внимание, что в PostgreSQL 9.0 E'testing \\ x20double-slash 'будет оцениваться как' testing \\ x20double-slash ', поэтому для литералов стиля E'string работает только подход с одним слешем
Alexander 14.08.2012 14:02:20
Для PostgreSQL 9.2 см .: postgresql.org/docs/9.2/interactive/…
Pitt 16.11.2012 12:37:08
psql \copyпримечание: я обнаружил, что оно E'\n'было записано в файл, '\n'а не в виде новой строки, когда я использовал его в аргументе запроса мета-команды psql `\ copy '.
Stew 31.12.2015 17:09:32

Прохладно.

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

39
4.08.2008 01:14:57

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

6
16.02.2010 23:51:23
На самом деле, нет. Если у меня есть standard_conforming_strings = on и запустить команду \copy xxxxxxxxxxx FROM /support01/db/data/xxxxxxxxx_7F.txt DELIMITER AS E'\x7f', я получаю parse error at "'\x7f'". Если у меня есть standard_conforming_strings = off; и использовать ту же команду выше без E и кавычек ... (DELIMITER AS \ x7f) Я получаю предупреждение, но данные загружаются нормально. Таким образом, ваше утверждение может быть правильным, но не в этом случае.
user329807 9.02.2011 23:38:56
Я имел в виду строки в операторах SQL, в то время как вы сейчас используете команду psql. Вы получаете ту же ошибку, используя команду COPY вместо \ copy?
eppesuig 17.11.2011 12:14:41
Это правильный ответ. Современные версии PG теперь включены по умолчанию.
jpmc26 3.01.2017 17:37:04

Я считаю маловероятным, чтобы 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=>
3
27.09.2008 16:04:29
Пожалуйста, попробуйте тестовый пример, который я дал, и вы сами это увидите.
rjohnston 22.09.2008 04:50:40
Интересно, похоже, что проблема была в драйвере JDBC тогда, потому что текст, выходящий из базы данных, был определенно
rjohnston 18.01.2009 23:59:27
Postgres делает усечь данные на входе в некоторых очень специфических ситуациях. Например, character varying(4)столбец с заданным входным значением «test» (два пробела после слова, 6 символов) усекает эти пробелы и сохраняет значение «test». Однако, как правило, вы можете предположить, что Postgres будет ошибаться, а не обрезать ваши данные.
Bryson 3.03.2014 20:18:28

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

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

или

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

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

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

1
16.09.2008 13:26:04
это случилось со мной Текст вставлялся в текстовое поле, просматривался источник, и, конечно же, была цитата, и весь текст присутствовал, просто не видно
roberthuttinger 31.08.2012 15:42:33