【问题标题】:Encoding error PostgreSQL 8.4编码错误 PostgreSQL 8.4
【发布时间】:2010-05-10 19:13:47
【问题描述】:

我正在从 CSV 文件导入数据。其中一个字段有口音(Telefónica O2 UK Limited)。应用程序在向表中插入数据时抛出错误。

PGError: ERROR:  invalid byte sequence for encoding "UTF8": 0xf36e6963
HINT:  This error can also happen if the byte sequence does not match the 
encoding expected by the server, which is controlled by "client_encoding".
: INSERT INTO "companies" ("name", "validated") 
    VALUES(E'Telef?nica O2 UK Limited', 't')

当我输入带有重音和变音符号的名称时,通过表单输入的数据有效。 我该如何解决这个问题?

编辑

我通过转换文件编码解决了这个问题。我将 CSV 文件上传到 Google 文档并将文件导出为 CSV。

【问题讨论】:

    标签: ruby-on-rails postgresql


    【解决方案1】:

    错误消息非常清楚:您的 client_encoding 设置设置为 UTF8 并且您尝试插入一个未以 UTF8 编码的字符(如果它是来自 MS Excel 的 CSV,则您的文件可能以Windows-1252)。

    您可以在应用程序中进行转换,也可以更改 PostgreSQL 连接以匹配您要插入的编码(从而使 PostgreSQL 能够为您进行转换)。您可以通过在尝试插入该数据之前在您的 PostgreSQL 连接上执行 SET CLIENT_ENCODING TO 'WIN1252'; 来做到这一点。导入后,您应该使用 RESET CLIENT_ENCODING; 将其重置为原始值

    HTH!

    【讨论】:

    • +1 - 您也可以尝试手动转换文件,例如使用 iconv。但是给你一些时间来了解你在做什么;反复试验在这里效果不佳。 2010 年的程序员必须了解 Unicode 和字符集编码的基础知识。
    • 文件编码有问题。我将 CSV 文件上传到 Google 文档并再次导出该文件。这解决了编码问题。
    【解决方案2】:

    我认为您可以尝试使用 Ruby gem rchardet,这可能是一个更好的解决方案。示例代码:

    require ‘rchardet’
    
    cd = CharDet.detect(string_of_unknown_encoding)
    encoding = cd['encoding']
    converted_string = Iconv.conv(‘UTF-8′, encoding, str_of_unknown_encoding)
    

    以下是一些相关链接:

    https://github.com/jmhodges/rchardet

    http://www.meeho.net/blog/2010/03/ruby-how-to-detect-the-encoding-of-a-string/

    【讨论】:

      猜你喜欢
      • 2021-06-23
      • 1970-01-01
      • 2018-12-28
      • 2013-01-24
      • 1970-01-01
      • 2011-11-02
      • 2023-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多