我的任务是将 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 上产生错误:
这个优秀的博客上有一篇关于一般问题和处理它们的方法的好帖子
我不建议在纯文本转储上盲目运行 iconv,因为它可能会将有效字符(例如:汉字)转换为其他字符。最好通过运行以下命令来找到无效的 UTF8 字符。
然后在特定数据上运行 iconv。检查此文档以获取详细的分步说明。
它可能与您的 Unix/Linux 环境中使用的默认编码有关。要检查当前的默认编码是哪种编码,请执行以下命令:
在这种情况下,我们可以清楚地看到它不是复制命令所依赖的 UTF-8 编码。
因此,为了解决这个问题,我们只需将示例中的 LANG 变量设置为以下内容:
注意:这仅适用于当前会话。将其添加到 ~/.bashrc 或类似文件中,以便在将来的任何 shell 会话启动时使用它。
参考
我引用了以下链接,它为我提供了确定源编码然后将其转换为所需的 UTF-8 编码的线索。 Linux 检查和更改编码