我正在开发一个ETL,它从Postgres上的数据仓库复制数据,该数据仓库使用UTF8字符集并使用典型的Windows字符集在Linux上运行到SQLServer,通过标准的Postgres ODBC驱动程序。
我发现我的一些源数据包含UTF8字符,这些字符无法转换为目标字符集,导致整个加载失败。
我是否可以使用postgres函数转换数据库中的数据?还有其他方法可以解决这个问题吗?
P.S。顺便说一句,为什么在一个表的数据流中遇到这个错误会导致我的所有负载都失败?
答案 0 :(得分:1)
如果目标编码中不支持UTF-8编码字符,PostgreSQL无法在不破坏数据的情况下进行转换。它不会破坏数据,因此会报告错误。
regress=# CREATE TABLE encoding_test(data text);
CREATE TABLE
regress=# INSERT INTO encoding_test(data) VALUES ('退休慰問金省182億怎麼用? 藍中常委建議發消費券');
INSERT 0 1
regress=# SHOW client_encoding;
client_encoding
-----------------
UTF8
(1 row)
regress=# SET client_encoding = 'Windows-1252';
SET
regress=# SELECT * FROM encoding_test ;
ERROR: character 0xe98080 of encoding "UTF8" has no equivalent in "WIN1252"
至于为什么导致一切停止工作:当Pg引发错误时,中止事务。同一事务中的未来语句将失败。这是设计,因为保持数据完整性很重要,并且在事务中如果一个操作失败,整个事务就会失败。它减少了错误发生之前不会被注意到的可能性,直到有人恢复了一个表然后问“那么......为什么这一个表空了?”。
这里应该做的是使用PostgreSQL Unicode ODBC驱动程序,或者使用带有utf-8 client_encoding
的ANSI ODBC驱动程序,然后将数据作为Unicode插入SQL Server,并将数据库正确设置为接受Unicode格式。
如果您确实希望通过将数据转换为Windows 8位代码页之一来销毁数据:PostgreSQL没有转换模式,可以使用占位符替换不可转换的字符。当做想要故意丢弃数据时,这偶尔会令人沮丧。我建议使用Unicode ODBC驱动程序保持PostgreSQL连接为UTF-8模式或(在Windows中),然后将字符串从Unicode转换为应用程序中所需的目标编码,并根据需要进行修改。
答案 1 :(得分:1)
我在这里做了一些假设。
修复:使用支持Unicode的ODBC驱动程序。我正在使用PostgreSQL Global Development Group的ODBC驱动程序。转到配置DSN /管理DSN并选择Unicode驱动程序。
尝试发布图片但系统不接受 - 显然我需要有10个“声望”才能发布。
祝你好运。Madhu