Как избежать двойных кавычек внутри PostgreSQL пользовательского типа в команде COPY - PullRequest
1 голос
/ 05 мая 2020

У меня проблема с экранированием некоторых символов (например, двойных кавычек) внутри команды COPY. Я переношу старую базу данных Oracle на PostgreSQL 11.7. В базе данных Oracle находятся пользовательские типы , и я переношу эти типы в PostgreSQL эквиваленты пользовательского типа, например:

create type udt_type as
(
x double precision,
y double precision,
rotation double precision,
width double precision,
height double precision,
justification integer,
font varchar(255),
text varchar(1000)
);

Если я создаю команду COPY, это выглядит что-то вот так:

COPY tablename (UDT_COLUMN) FROM stdin WITH NULL 'NULL' DELIMITER '|' ;
(707141.392,235754.051,6.283185,,,0.0,,Some text 2")

Двойные кавычки здесь должны быть помечены для дюймов, но я не могу правильно вставить значение, потому что каждый раз, когда я избегаю двойных кавычек, PostgreSQL удваивает символ, и это приводит к "".

Я пробовал много других версий:

(707141.392,235754.051,6.283185,,,0.0,,Some text 2")
(707141.392,235754.051,6.283185,,,0.0,,"Some text 2""")
(707141.392,235754.051,6.283185,,,0.0,,Some text 2\")
(707141.392,235754.051,6.283185,,,0.0,,"Some text 2\"")
...

Результатов:

(707141.392,235754.051,6.283185,,,0.0,,"Some text 2""")

Как правильно экранировать символ. Я даже не могу изменить значение вручную в DataGrip или pgadmin без ошибки Unexpected end of input. Экранирование работает правильно в INSERT, но поведение определенных пользователем типов в COPY отличается.

EDIT

С одиночными кавычками это не работает:

COPY tablename (UDT_COLUMN) FROM stdin WITH NULL 'NULL' DELIMITER '|' ;
(707141.392,235754.051,6.283185,,,0.0,,'Some text 2"')

Ошибка:

psql:tablename.sql:3: ERROR:  malformed record literal: "(707141.392,235754.051,6.283185,,,0.0,,'Some text 2"')"
DETAIL:  Unexpected end of input.
CONTEXT:  COPY tablename, line 1, column udt_column: "(707141.392,235754.051,6.283185,,,0.0,,'Some text 2"')"
...