PostgreSQL:将数据从SQL Server 2008 R2导出到PostgreSQL 9.5

PostgreSQL:将数据从SQL Server 2008 R2导出到PostgreSQL 9.5,postgresql,Postgresql,我有一个表可以将数据从SQLServer导出到PostgreSQL 我采取了以下步骤: 步骤1:从SQL Server导出数据: Source: SQL Server Table Destination: Flat file Destination Table Or Query to copy: Query 查询: SELECT COALESCE(convert(varchar(max),id),'NULL') + '|' +COALESCE(convert(varcha

我有一个表可以将数据从SQLServer导出到PostgreSQL

我采取了以下步骤:

步骤1:从SQL Server导出数据:

Source: SQL Server Table
Destination: Flat file Destination 
Table Or Query to copy: Query 
查询:

SELECT 
    COALESCE(convert(varchar(max),id),'NULL') + '|'
    +COALESCE(convert(varchar(max),Name),'NULL') + '|'
    COALESCE(convert(varchar(max),EDate,121),'NULL') AS A
FROM tbl_Employee;
文件名:File.txt

步骤2:复制到PostgreSQL

命令:

\COPY tbl_employee FROM '$FilePath\file.txt' DELIMITER '|' NULL AS 'NULL' ENCODING 'LATIN1'
正在获取以下错误消息:

ERROR:  invalid byte sequence for encoding "UTF8": 0xc1 0x20

您告诉Postgres源代码将被编码为LATIN1:

但不是这样,就是文件损坏了。否则我们将看不到错误消息。“$FilePath\file.txt”的真正编码是什么

当前客户端_编码与此无关,因为:

编码

指定以编码名称对文件进行编码。如果省略此选项,则使用当前客户端编码

\copy是psql中SQL copy的包装器

您的服务器编码在很大程度上也是不相关的——只要Postgres可以使用a,并且目标编码包含源编码的所有字符——这是LATIN1->UTF8:iso_8859_1_to_UTF8的情况


因此,剩下的错误源是您的文件,它几乎肯定不是有效的拉丁文1。

正如它所说,您的字节序列不是有效的UTF8。我猜原始源数据库不是UTF8格式的。为了最大限度地减少转换错误,您需要将Postgres的后端配置为使用原始数据库的任何编码。该错误消息令人惊讶。这是哪个PostgreSQL版本?您从SHOW client_编码中得到了什么;并显示服务器_编码;?这两种编码都是“UTF8”。@LaurenzAlbe:我不认为服务器或客户端编码是关键。这是文件或其编码。我意识到客户端编码不应该在这里发挥作用,但我仍然不知道。如果文件包含字节序列c120,则应无误地将其转换为“Á”。所以发生的事情一定是iso8859_1_to_utf8将某个单字节转换为C1 20,但我看不出这是怎么发生的。。。该函数不会抛出任何这样的错误消息。@LaurenzAlbe:很好。我不完全确定错误究竟是如何产生的。我猜源文件有非法字节,用于LATIN1损坏的文件或错误的编码,转换会真诚地执行其工作,并为非法输入生成非法UTF8。为了生成更有用的错误消息,Postgres可能会更彻底地测试源代码是否合法,而不是等到转换之后再进行测试——这可能会更昂贵,这就是为什么没有实现。或者OP在问题中犯了c/p错误。只是在这里猜测。。。
\copy ... ENCODING 'LATIN1'