使用 sed 转换 postgresql 转储文件中的十六进制字符

使用 sed 转换 postgresql 转储文件中的十六进制字符

我正在将几个数据库从 Postgresql 8.3 服务器迁移到 Postgresql 8.4 服务器。到目前为止,它运行良好,但有一个数据库给我带来了一些麻烦。该数据库在 8.3 服务器中被列为 unicode 编码,但不知何故,客户端程序设法向其中注入了一些无效的 unicode 数据。

当我使用 postgres 的自定义格式进行正常转储和恢复时,新服务器不会接受它,并抱怨unicode错误。

我的计划是将数据库转储为纯文本,然后使用 sed 将无效字符替换为空(不需要)。但是如何让 sed 处理文件中的十六进制/二进制值?

答案1

一个典型的解决方案是使用iconv -c

答案2

根据 Peter 的回答,使用 iconv 是大多数人用来清理坏数据的典型解决方案。如果您想提前对数据进行一些分析(并可能在原始数据库中清理数据),您可以使用以下命令https://github.com/xzilla/utf8checker找到问题所在。

答案3

根据二进制 sed 替换在 stackoverflow 上,最好的选择是通过hexdump

hexdump input | sed -e "..." | xxd -r -p output

答案4

一位同事向我推荐了 Perl:

cat databasedump.sql | perl -pi -e 's/\xc3\xa9//g;' > fixeddatabasedump.sql

好的,所以它不是 sed,但至少语法大致相同。

相关内容