当源数据库在UTF8中编码时,如何在还原上求解UTF8无效的字节序列复制错误?

dba.stackexchange https://dba.stackexchange.com/questions/4777

  •  16-10-2019
  •  | 
  •  

我被赋予了将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;

我正在在目标服务器上完全创建此数据库。但是,当我使用还原选项从.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将其馈送以纠正编码。

这里 是有关此的更多信息。

其他提示

“我不知道他们是怎么到达那里的”

它可能是按照描述的 这里 - 尽管这会在8.4上产生错误:

如果您使用任何文本类型(即文本,varchar(10)等)创建一个表,则可以使用八倍段插入无效的字节序列。

例如,如果您具有UTF8编码的数据库,则可以执行:

=>创建表Foo(t text);

=>插入foo值(e' 377');

现在,如果您将表复制出来,则无法将结果文件复制回。这意味着您的PG_DUMP备份将无法还原。重新获得数据的唯一方法是重新估算该值。

有一个很好的帖子 出色的博客 关于一般问题以及与他们打交道的一些方法

它可能是在UNIX/Linux环境中使用的默认编码。要检查当前哪个编码是默认的编码,请执行以下操作:

$ echo $LANG
en_US

在这种情况下,我们可以清楚地看到它不是UTF-8编码,而是复制命令所依赖的一个编码。

因此,要解决此问题,我们只是将lang变量设置为示例以下:

$ export LANG=en_US.UTF-8

注意:这仅适用于当前会话。将其添加到〜/.bashrc或类似的情况下,以便在任何未来的Shell会话的启动中可用。

参考

我不建议在纯文本转储上盲目运行ICONV,因为它可能会将有效字符(例如中文字符)转换为其他一些字符。最好通过在下面的命令下运行,找到无效的UTF8字符。

grep -naxv '.*' plain_text_dump.sql

然后在特定数据上运行ICONV。查看 该文档以详细逐步说明.

许可以下: CC-BY-SA归因
不隶属于 dba.stackexchange
scroll top