Rails - 在Postgres DB中保存邮件附件导致PGError:错误:编码“UTF8”的无效字节序列:0xa0

时间:2010-12-12 04:12:57

标签: ruby-on-rails postgresql ruby-on-rails-3 actionmailer

之前有没有人见过这个错误?

  

PGError:错误:编码“UTF8”的无效字节序列:0xa0

我正在尝试将任何文件类型的传入邮件附件保存到数据库进行处理。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您将数据保存到哪种类型的列?如果附件可以是任何类型,则需要 bytea 列以确保数据仅作为blob(二进制“大”对象)传递。正如其他答案所述,该错误表明发送给PostgreSQL的一些数据被标记为UTF-8编码的文本无效。

我建议您将电子邮件附件与其MIME内容类型标头一起存储为二进制文件。 Content-Type标头应包括将二​​进制内容转换为附件文本所需的字符编码,其中有意义:例如“text / plain; charset = iso-8859-1”。

如果您希望数据库中的解码文本可用,您可以让应用程序对其进行解码并存储文本内容,可能还有一个额外的列用于解码版本。例如,如果您想在电子邮件附件上使用PostgreSQL的全文索引,那么这很有用。但是,如果您只是想将它们存储在数据库中以便以后检索,只需将它们存储为二进制文件,并将文本编码问题留给应用程序。

答案 1 :(得分:0)

0xa0是一个不间断的空间,可能是latin1编码。在Python中,我使用str.decode()和str.encode()将其从当前编码更改为目标编码,这里是'utf8'。但我不知道你是如何在Rails中实现它的。

答案 2 :(得分:0)

我不知道Rails,但是当PG给出此错误消息时,它意味着:

  • postgres与您的Rails客户端之间的连接已正确配置为使用utf-8编码,这意味着客户端和postgres之间的所有文本数据必须以utf-8

  • 进行编码
  • 并且您的Rails客户端错误地发送了一些以其他编码编码的数据(最可能是latin-1或ISO-8859):因此postgres拒绝它

您必须查看将数据插入数据库的客户端代码,可能是您尝试插入非unicode字符串或发生了一些不正确的转码。