Postgres 在 SQL 服务器 BCP 文件的最后一个预期列之后复制错误额外数据
Postgres copy error extra data after last expected column from SQL Server BCP file
我正在将数据库从 SQL Windows 上托管的 Server 2016 迁移到 Debian 上托管的 Postgres 11。
我正在使用 BCP 实用程序从 SQL Server 2016 导出数据,并使用 COPY 命令将其导入 Postgres 11。
对于很多 table 它都有效,但对于某些,我不断收到 "extra data after last expected column" 错误,即使我的文件包含相同数量的列。似乎 COPY 命令在处理包含空字符串的行时出现问题,在 Notepad++ 中显示为 "NUL"。
这是 table 在 SQL 服务器中的定义。 (table 和列名已更改)
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 中的 table 定义。
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 命令无法处理的问题。
如果我尝试将一些数据放在第一行的 "NUL" 字符中,那么复制命令会在第三行而不是第一行给我 "extra data after last expected column" 字符。我无法编辑文件并用其他内容替换 "NUL" 字符,因为我有数百个 table 需要迁移一些非常大的 table。
我需要为 SQL 服务器 BCP 实用程序或 Postgres COPY 命令指定一个选项才能使这项工作正常进行。
我正在将数据库从 SQL Windows 上托管的 Server 2016 迁移到 Debian 上托管的 Postgres 11。
我正在使用 BCP 实用程序从 SQL Server 2016 导出数据,并使用 COPY 命令将其导入 Postgres 11。
对于很多 table 它都有效,但对于某些,我不断收到 "extra data after last expected column" 错误,即使我的文件包含相同数量的列。似乎 COPY 命令在处理包含空字符串的行时出现问题,在 Notepad++ 中显示为 "NUL"。
这是 table 在 SQL 服务器中的定义。 (table 和列名已更改)
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 中的 table 定义。
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 命令无法处理的问题。
如果我尝试将一些数据放在第一行的 "NUL" 字符中,那么复制命令会在第三行而不是第一行给我 "extra data after last expected column" 字符。我无法编辑文件并用其他内容替换 "NUL" 字符,因为我有数百个 table 需要迁移一些非常大的 table。
我需要为 SQL 服务器 BCP 实用程序或 Postgres COPY 命令指定一个选项才能使这项工作正常进行。