我正在将几个数据库从 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,但至少语法大致相同。