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

голоса
95

Попытка вставить экранирующий символ в таблице результатов в предупреждение.

Например:

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 )

Кто знает, как обойти это?

Задан 04/08/2008 в 02:00
источник пользователем
На других языках...                            


5 ответов

голоса
104

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

Я нашел обсуждение, что указанный текст, необходимый для предваряться «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');
Ответил 04/08/2008 d 02:07
источник пользователем

голоса
32

Круто.

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

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

PostgreSQL также принимает «Escape» строковые константы, которые являются расширением стандарта SQL. Побег строковой константы задается написание буквы Е (верхний или нижний регистр) непосредственно перед открытием одинарных кавычек, например E'foo. (При продолжении строки побега постоянная по линии, написать E только перед первым открытием цитаты.) В пределах строки побега, обратный косой черты (\) начинается последовательностью обратного косой черты побега C-подобный, в котором комбинация обратного косой черты и следующий характер ( с) представляет собой специальное значение байта. \ B является забой, \ F является подача бумаги, \ п является новой строки, \ г возврат каретки, \ т вкладка. Также поддерживается \ цифры, где цифра представляет собой восьмеричное значение байта, и \ xhexdigits, где шестн._числи представляет собой шестнадцатеричное значение байт. (Это ваша ответственность, что последовательности байтов Создаваемые допустимые символы в наборе символов сервера кодирования.) Любой другой символ после обратного слэша буквально. Таким образом, чтобы включать в себя символ обратной косой черты, написать два обратных слеша (\\). Кроме того, одна цитата может быть включена в строку побега, написав \», в дополнение к обычному образу„“.

Ответил 04/08/2008 d 02:14
источник пользователем

голоса
5

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

Ответил 17/02/2010 d 00:51
источник пользователем

голоса
3

Я считаю, что крайне маловероятно для 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 IGNORE  0 1
milen=> select * from EscapeTest;
          text
------------------------
 This will be inserted
  This will not be
(1 row)

milen=>
Ответил 19/09/2008 d 20:24
источник пользователем

голоса
2

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

Это будет вставлено \ п Это не может быть будет

или

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

Это не будет

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

Ответил 16/09/2008 d 14:26
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more