У рядку postgresql набирайте рядки та літери втечі


113

Спроба вставити символ таблиці в таблицю призводить до попередження.

Наприклад:

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 )

Хтось знає, як це обійти?

Відповіді:


131

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

Я знайшов дискусію, яка вказувала на те, що текст повинен передувати "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');

5
Зауважте, що на PostgreSQL 9.0 E'testing \\ x20double-slash 'оцінюватиметься як "тестування \\ x20double-slash", тому для літераторів стилю E'string' працює лише однокрасовий підхід
Олександр

2
Про PostgreSQL 9.2 див .: postgresql.org/docs/9.2/interactive/…
Пітт

psql \copyПримітка. Я виявив, що це E'\n'було написано для файлів, '\n'а не як новий рядок, коли я використовував його в аргументі запиту до мета-команди ps \ \ 'copy'.
Рагу

40

Класно.

Я також знайшов документацію щодо Е:

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

PostgreSQL також приймає рядкові константи "escape", які є розширенням до стандарту SQL. Константа рядового рядка визначається написанням літери E (верхній або нижній регістр) безпосередньо перед початковою єдиною цитатою, наприклад, E'foo. (Продовжуючи константну лінію рядка відхилення через рядки, пишіть E лише перед першою вступною цитатою.) У рядок рятувального рядка символ зворотної косої риски (\) починає C-подібну послідовність втечі зворотньої косої риси, у якій поєднання зворотнього косого кута та наступного символу ( s) представляє особливе значення байта. \ b - це зворотний простір, \ f - канал форми, \ n - новий рядок, \ r - повернення каретки, \ t - вкладка. Також підтримуються \ цифри, де цифри представляють вісімкове байтове значення, і \ xhexdigits, де hexdigits представляє шістнадцяткове значення байта. (Ви несете відповідальність за те, щоб створені вами послідовності байтів були дійсними символами кодування набору символів сервера.) Будь-який інший символ після косої риски приймається буквально. Таким чином, для включення символу зворотної косої риси напишіть два косої косої риски (\\). Крім того, одна цінна цитата може бути включена у рядок відстеження, записавши \ ', крім звичайного способу' '.


6

Попередження видається з моменту використання зворотних косих рисок у рядках. Якщо ви хочете уникнути повідомлення, введіть цю команду "встановити standard_conforming_strings = on;". Потім використовуйте "E" перед рядком, включаючи зворотні риски, які ви хочете, щоб postgresql вводив.


1
Не зовсім. Якщо у мене є standard_conforming_strings = і запускаю команду \copy xxxxxxxxxxx FROM /support01/db/data/xxxxxxxxx_7F.txt DELIMITER AS E'\x7f', я отримую parse error at "'\x7f'". Якщо у мене стандарт_conforming_strings = вимкнено; і використовувати ту саму команду, що була вище, без E і котирувань ... (DELIMITER AS \ x7f) Я отримую попереджувальне повідомлення, але дані завантажуються нормально. Тож ваше твердження може бути правильним, але не в цьому випадку.

Я мав на увазі рядки в операторах SQL, поки ви використовуєте команду psql. Ви отримуєте ту саму помилку, використовуючи команду COPY замість \ copy?
eppesuig

1
Це правильна відповідь. Сучасні версії PG тепер за замовчуванням включають його.
jpmc26

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 0 1
milen=> select * from EscapeTest;
          text
------------------------
 This will be inserted
  This will not be
(1 row)

milen=>

Спробуйте спробувати тест, який я подав, і ви переконаєтесь у цьому.
rjohnston

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

3
Postgres справді врізає дані на вхід у деяких дуже конкретних ситуаціях. Наприклад, character varying(4)стовпець із введенням "тест" (два пробіли після слова, 6 символів) обріже пробіли і збереже значення "тест". Однак, як правило, ви можете припустити, що Postgres помилиться, а не скорочує ваші дані.
Брайсон

0

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

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

або

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

Цього не буде

Також який інтерфейс ви використовуєте? Чи можливо, що щось по дорозі їсть ваші зворотні риси?


1
це сталося зі мною. Текст вставляли у текстове поле, переглядали джерело, і, звичайно, була цитата, і весь текст був присутній, просто не видно
roberthuttinger
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.