【问题标题】:Fixing Unicode Byte Sequences修复 Unicode 字节序列
【发布时间】:2010-10-07 00:14:17
【问题描述】:

有时在将内容复制到 PostgreSQL 时,我会收到错误,指出存在无效的字节序列。

有没有一种简单的方法使用 vim 或其他实用程序来检测导致错误的字节序列,例如:invalid invalid byte sequence for encoding "UTF8": 0xde70 等等,并且可能是简单的方法进行转换?

编辑:

我的工作流程是什么:

  1. 转储 sqlite3 数据库(来自 trac)
  2. 试图在 postgresql 中重放它

也许有更简单的方法?

更多编辑:

也试过这些:

  1. 运行 enca 来检测文件的编码

    • 告诉我这是 ASCII
  2. 尝试使用 iconv 从 ASCII 转换为 UTF8。出错了

起作用的是删除它抱怨的几行错误。但这并没有真正解决真正的问题。

【问题讨论】:

    标签: sqlite postgresql vim unicode


    【解决方案1】:

    基于一个简短的句子,听起来您的文本采用一种编码(例如 ANSI/ASCII),而您告诉 PostgreSQL 它实际上是另一种编码(Unicode UTF8)。您将使用的所有不同工具:PostgreSQL、Bash、某种编程语言、另一种编程语言、来自其他地方的其他数据、文本编辑器、IDE 等,都具有可能不同的默认编码,以及某些步骤顺便说一句,没有进行正确的转换。我会检查跨越这些边界的数据流,以确保编码对齐,或者正确检测到编码并且正确转换文本。

    【讨论】:

    • 刚刚尝试使用 iconv 尝试从 ASCII 转换为 UTF8。我认为它已经在 UTF8 中,因为我在使用 ASCII 时遇到了错误。试过 iconv -f UTF8 -t UTF8 并没有得到任何错误。也许某些不应该在转储文件中的东西被转义了。
    • 如果 PostgrSQL 不接受它作为 UTF8,它就不可能是 UTF8。它可能包含许多其他可能的编码。(7 位 ASCII 与 8 位 ANSO,或者可能是 UTF16 或现有的数百种其他编码中的任何一种。在编码级别没有任何“转义”。
    • ASCII 本身是 7 位的,并且是完全有效的 UTF-8。也许某些东西正在使用 8 位 ASCII 扩展。那里有很多,它们不是有效的 UTF-8。
    【解决方案2】:

    如果您知道转储文件的编码,则可以使用recode 将其转换为 utf-8。例如,如果它是用 latin-1 编码的:

    recode latin-1..utf-8 < dump_file > new_dump_file
    

    如果你不确定编码,你应该看看 sqlite 是如何配置的,或者尝试一些试验和错误。

    【讨论】:

      【解决方案3】:

      我想通了。这不是真正的编码问题。

      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
      

      是的,有点像 hack,但它确实有效。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-11-16
        • 2013-03-10
        • 2021-09-18
        • 1970-01-01
        • 2018-08-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多