当前位置: 首页>>技术解读>>正文


当源数据库以UTF8编码时,如何解决恢复时UTF8无效字节序列复制错误?

webfans 技术解读 , , , 去评论

问题描述

我被赋予了将PostgreSQL 8.2.x数据库迁移到另一台服务器的任务。为此,我使用pgAdmin 1.12.2(顺便说一下在Ubuntu 11.04上)并使用自定义/压缩格式(.backup)和UTF8编码使用备份和还原。

原始数据库是UTF8,如下所示:

-- Database: favela

-- DROP DATABASE favela;

CREATE DATABASE favela
  WITH OWNER = favela
       ENCODING = 'UTF8'
       TABLESPACE = favela
       CONNECTION LIMIT = -1;

我正在目标服务器上创建这样的数据库。但是当我使用Restore选项从.backup文件恢复数据库时,它会给我一些错误:

pg_restore: restoring data for table "arena"
pg_restore: [archiver (db)] Error while PROCESSING TOC:
pg_restore: [archiver (db)] Error from TOC entry 2173; 0 35500 TABLE DATA arena favela
pg_restore: [archiver (db)] COPY failed: ERROR:  invalid byte sequence for encoding "UTF8": 0xe3a709
HINT:  This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".
CONTEXT:  COPY arena, line 62

当我检查哪个记录触发了这个错误实际上一些vartext字段有变量字符,如ç(用葡萄牙语,例如,”caça”),当我从记录中的文本中手动删除它们时,错误传递到下一个记录它们 – 因为当复制有错误时它会停止在此表上插入数据。我不想一个接一个地手动更换它们来实现这一目标。

但它有点奇怪,因为UTF8应该没有这种问题,对吧?

我不知道他们是如何到达那里的。我只是迁移数据库,并且我不知道数据库是否像LATIN1那样,然后被错误地更改为UTF8。

有没有办法检查表/数据库是否有无效的UTF8序列?或者以任何方式强制/重新转换这些字符到UFT8中,这样我在执行恢复时不会遇到任何问题?

提前致谢。

最佳解决思路

在互联网上挖掘,我发现这是一个非常普遍的问题。常见的解决方案是使用纯文本格式转储并通过iconv提供它来纠正编码。

Here是关于它的更多信息。

次佳解决思路

“I don’t know how they got there in the first place”

它可能发生在描述here – 尽管这会在8.4上产生错误:

If you create a table with any text type (i.e. text, varchar(10), etc.), then you can insert an invalid byte sequence into that field using octal escapes.

For instance, if you have a UTF8-encoded database, you can do:

=> CREATE TABLE foo(t TEXT);

=> INSERT INTO foo VALUES(E’\377′);

Now, if you COPY the table out, you can’t COPY the resulting file back in. That means your pg_dump backups won’t be able to restore. The only way to get your data back in is to re-escape that value.

这个excellent blog有关于一般问题和处理它们的一些方法的好帖子

参考资料

本文由朵颐IT整理自网络, 文章地址: https://duoyit.com/article/3046.html,转载请务必附带本地址声明。