有时将内容复制到PostgreSQL中时,我会收到错误的字节序列无效。
是否有一种简单的方法可以使用vim或其他实用程序来检测导致错误的字节序列,例如:无效的无效字节序列,用于编码“UTF8”:0xde70 以及诸如此类,可能和简单的方法做转换?
编辑:
我的工作流程是:
也许有一种更简单的方法?
更多编辑:
还试过这些:
运行enca以检测文件的编码
尝试使用iconv将ASCII转换为UTF8。出现错误
有什么工作正在删除它抱怨的那对错误的行。但这并没有真正解决真正的问题。
答案 0 :(得分:4)
基于一个简短的句子,听起来你有一个编码的文本(例如ANSI / ASCII),你告诉PostgreSQL它实际上是另一种编码(Unicode UTF8)。您将使用的所有不同工具:PostgreSQL,Bash,一些编程语言,另一种编程语言,来自其他地方的其他数据,文本编辑器,IDE等,都具有可能不同的默认编码,以及一些步骤顺便说一句,正确的转换没有完成。我会检查它跨越这些边界的数据流,以确保编码排列,或正确检测编码并正确转换文本。
答案 1 :(得分:1)
如果您知道转储文件的编码,可以使用recode
将其转换为utf-8。例如,如果它是用latin-1编码的:
recode latin-1..utf-8 < dump_file > new_dump_file
如果你不确定编码,你应该看看如何配置sqlite,或者尝试一些反复试验。
答案 2 :(得分:1)
我明白了。这不是一个编码问题。
SQLite的输出转义字符串与Postgres预期的不同。有些情况下输出'asdf \ xd \ foo'。我相信'\ x'导致它期望以下字符是unicode编码。
解决方案是在sqlite 3中以CSV模式单独转储每个表。
第一
sqlite3 db/trac.db .schema | psql
现在,这在大多数情况下都可以将数据复制回来
for table in `sqlite3 db/trac.db .schema | grep TABLE | sed 's/.*TABLE \(.*\) (/\1/'`
do
echo ".mode csv\nselect * from $table;" | sqlite3 db/trac.db | psql -c "copy $table from stdin with csv"
done
是的,有点像黑客,但它有效。