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

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

В чем разница между методом "==" и equals()
В чем разница между методом "==" и equals()
Это один из наиболее часто задаваемых вопросов новичкам на собеседовании. Давайте обсудим его на примере.
Замена символа по определенному индексу в JavaScript
Замена символа по определенному индексу в JavaScript
В JavaScript существует несколько способов заменить символ в строке по определенному индексу.
120
0
278 152
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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');

Обратите внимание, что в PostgreSQL 9.0 E'testing \\ x20double-slash 'будет оцениваться как' testing \\ x20double-slash ', поэтому для литералов стиля E'string работает только подход с одинарной косой чертой.

Alexander 14.08.2012 18:02

Для PostgreSQL 9.2 см .: postgresql.org/docs/9.2/interactive/…

Pitt 16.11.2012 16:37

Примечание psql \copy: я обнаружил, что E'\n' был записан в файл как '\n', а не как новая строка, когда я использовал его в аргументе запроса мета-команды psql `\ copy '.

Stew 31.12.2015 20:09

Круто.

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

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

PostgreSQL also accepts "escape" string constants, which are an extension to the SQL standard. An escape string constant is specified by writing the letter E (upper or lower case) just before the opening single quote, e.g. E'foo'. (When continuing an escape string constant across lines, write E only before the first opening quote.) Within an escape string, a backslash character (\) begins a C-like backslash escape sequence, in which the combination of backslash and following character(s) represents a special byte value. \b is a backspace, \f is a form feed, \n is a newline, \r is a carriage return, \t is a tab. Also supported are \digits, where digits represents an octal byte value, and \xhexdigits, where hexdigits represents a hexadecimal byte value. (It is your responsibility that the byte sequences you create are valid characters in the server character set encoding.) Any other character following a backslash is taken literally. Thus, to include a backslash character, write two backslashes (\). Also, a single quote can be included in an escape string by writing \', in addition to the normal way of ''.

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

This will be inserted \n This will not be

или же

This will be inserted

This will not be

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

это случилось со мной. Текст вставлялся в текстовое поле, просматривался источник, и, конечно же, была цитата, и весь текст присутствовал, просто не виден

roberthuttinger 31.08.2012 19:42

Я считаю крайне маловероятным, что 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=>

Пожалуйста, попробуйте тестовый пример, который я дал, и вы убедитесь в этом сами.

rjohnston 22.09.2008 08:50

Интересно, похоже, тогда проблема была в драйвере JDBC, потому что текст, выходящий из базы данных, определенно был усечен ...

rjohnston 19.01.2009 02:59

Postgres делает усекает данные при вводе в некоторых очень специфических ситуациях. Например, столбец character varying(4), для которого задан ввод «test» (два пробела после слова, 6 символов), будет усекать пробелы и сохранять значение «test». Однако, как правило, вы можете предположить, что Postgres будет ошибаться, а не усекать ваши данные.

Bryson 04.03.2014 00:18

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

Не совсем. Если у меня 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 10.02.2011 02:38

Я имел в виду строки в операторах SQL, а сейчас вы используете команду psql. Вы получаете ту же ошибку, используя команду COPY вместо \ copy?

eppesuig 17.11.2011 16:14

Это правильный ответ. Современные версии PG теперь по умолчанию включены.

jpmc26 03.01.2017 20:37

Другие вопросы по теме