У меня проблема с экранированием некоторых символов (например, двойных кавычек) внутри команды 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"')"