Я перемещаю базу данных из SQL Server 2016, размещенной в Windows, в Postgres 11, размещенную в Debian.
Я экспортирую данные с помощью утилиты BCP из SQL Server 2016 и импортирую их в Postgres 11 с помощью COPYкоманда.
Для многих таблиц это работает, но для некоторых я получаю ошибку «дополнительные данные после последнего ожидаемого столбца», даже если мой файл содержит одинаковое количество столбцов.Кажется, что команда COPY имеет проблемы со строками, которые содержат пустые строки, показанные как «NUL» в Notepad ++.
Вот определение моей таблицы в SQL Server.(имена таблиц и столбцов изменены)
Create table test (
TypeId int not null,
Name nvarchar(50) not null,
License nvarchar(50) not null,
LastChanged timestamp not null,
Id1 uniqueidentifier not null,
Id2 uniqueidentifier not null,
DescriptionCol nvarchar(256) not null default '',
ConditionCol bit not null default 0,
ConditionCol2 bit not null default 0,
ConditionCol3 bit not null default 1,
DescriptionCol2 nvarchar (2) not null default ''
)
А вот определение таблицы в Postgres.
CREATE TABLE test (
typeid integer NOT NULL,
name citext COLLATE pg_catalog."default" NOT NULL,
license citext COLLATE pg_catalog."default" NOT NULL,
lastchanged bytea NOT NULL,
id1 uuid NOT NULL,
id2 uuid NOT NULL DEFAULT uuid_generate_v4(),
descriptioncol text COLLATE pg_catalog."default" NOT NULL DEFAULT ''::text,
conditioncol boolean NOT NULL DEFAULT false,
conditioncol2 boolean NOT NULL DEFAULT false,
conditioncol3 boolean NOT NULL DEFAULT true,
descriptioncol2 text COLLATE pg_catalog."default" NOT NULL
)
Я извлекаю данные таким образом:
bcp Database.Schema.test out E:\MyFile.dat -S ServerName -U User -P Password -a65535 -c -C 65001
Затем я подключаюсь к удаленному серверу Postgres и импортирую данные следующим образом:
\copy Schema.test FROM 'E:\MyFile.dat' (DELIMITER E'\t', FORMAT CSV, NULL '', ENCODING 'UTF8');`
Теперь, если я открою файл, созданный в Notepad ++, я увижу символы «NUL», и это, похоже, является проблемой.что команда COPY не может принять.
![File in notepad](https://i.stack.imgur.com/zkNxM.png)
Если я попытаюсь поместить некоторые данные в символ NUL в первой строке, то команда копированиядает мне «дополнительные данные после последнего ожидаемого столбца» в третьей строке вместо первой строки.Я не могу отредактировать файл и заменить символ «NUL» чем-то другим, поскольку у меня есть сотни таблиц для переноса с некоторыми очень большими таблицами.
Чтобы сделать эту работу, мне нужно либо указать опцию для утилиты BCP SQL Server, либо для команды Postgres COPY.