Строковые литералы и экранирующие символы в postgresql

StackOverflow https://stackoverflow.com/questions/935

  •  08-06-2019
  •  | 
  •  

Вопрос

Попытка вставить 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)

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

Это было полезно?

Решение

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

Я нашел обсуждение, в котором указывалось, что тексту должна предшествовать буква "Е", как таковая:

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');

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

Прохладный.

Я также нашел документацию, касающуюся E:

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

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

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

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

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

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

или

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top