Попытка вставить 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)
Кто-нибудь знает, как это обойти?


Частично. Текст вставлен, но предупреждение по-прежнему генерируется.
Я нашел обсуждение, в котором указывалось, что перед текстом должна стоять буква "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.2 см .: postgresql.org/docs/9.2/interactive/…
Примечание psql \copy: я обнаружил, что E'\n' был записан в файл как '\n', а не как новая строка, когда я использовал его в аргументе запроса мета-команды psql `\ copy '.
Круто.
Я также нашел документацию по 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
Кроме того, какой интерфейс вы используете? Возможно ли, что что-то по пути съедает вашу обратную косую черту?
это случилось со мной. Текст вставлялся в текстовое поле, просматривался источник, и, конечно же, была цитата, и весь текст присутствовал, просто не виден
Я считаю крайне маловероятным, что 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=>
Пожалуйста, попробуйте тестовый пример, который я дал, и вы убедитесь в этом сами.
Интересно, похоже, тогда проблема была в драйвере JDBC, потому что текст, выходящий из базы данных, определенно был усечен ...
Postgres делает усекает данные при вводе в некоторых очень специфических ситуациях. Например, столбец character varying(4), для которого задан ввод «test» (два пробела после слова, 6 символов), будет усекать пробелы и сохранять значение «test». Однако, как правило, вы можете предположить, что Postgres будет ошибаться, а не усекать ваши данные.
Предупреждение выдается, поскольку вы используете обратную косую черту в своих строках. Если вы хотите избежать этого сообщения, введите команду «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) Я получаю предупреждающее сообщение, но данные загружаются нормально. Так что ваше утверждение может быть правильным, но не в этом случае.
Я имел в виду строки в операторах SQL, а сейчас вы используете команду psql. Вы получаете ту же ошибку, используя команду COPY вместо \ copy?
Это правильный ответ. Современные версии PG теперь по умолчанию включены.
Обратите внимание, что в PostgreSQL 9.0 E'testing \\ x20double-slash 'будет оцениваться как' testing \\ x20double-slash ', поэтому для литералов стиля E'string работает только подход с одинарной косой чертой.