我正在将几个数据库从Postgresql 8.3服务器移动到Postgresql 8.4服务器。 到目前为止工作得很好,但是一个基地给了我一些麻烦。 该数据库在8.3服务器中被列为unicode编码,但是不知何故,客户端程序已经设法向其中注入一些无效的unicode数据。
当我使用postgres的自定义格式进行正常转储和恢复时,新服务器将不会接受它,抱怨unicode错误。
我的计划是做一个数据库的纯文本转储,然后使用sedreplace无效字符(他们不需要)。 但是,如何让sed在文件中的hex/二进制值工作?
一个典型的解决scheme是使用iconv -c 。
根据彼得的回答,使用iconv是大多数人用来清理不良数据的典型解决scheme。 如果您想提前对数据进行一些分析(也许可以在原始数据库中进行清理),则可以使用以下https://github.com/xzilla/utf8checker查找故障点。
根据stackoverflow上的二进制sedreplace ,你最好的select是通过hexdump移动:
hexdump input | sed -e "..." | xxd -r -p output
这将0x32 (空格)范围之外的所有字符到0x7e (代字号):
someprog | LANG=C sed 's/[\x00-\x31\x7f-\xff]//g'
您可以使用其他字符范围更具select性。
一位同事向我介绍了Perl的方向:
cat databasedump.sql | perl -pi -e's / \ xc3 \ xa9 // g;' > fixeddatabasedump.sql
好吧,所以它不是sed,但至less语法是差不多的。
tr -d '[:xdigit:]' < old_database > new_database也可能工作。
tr -d只删除'[:xdigit:]'hex字符