【发布时间】:2010-12-12 04:12:56
【问题描述】:
以前有人见过这个错误吗?
PGError: ERROR: invalid byte sequence for encoding "UTF8": 0xa0
我正在尝试将任何文件类型的传入邮件附件保存到数据库中以供处理。
有什么想法吗?
【问题讨论】:
标签: ruby-on-rails postgresql ruby-on-rails-3 actionmailer
以前有人见过这个错误吗?
PGError: ERROR: invalid byte sequence for encoding "UTF8": 0xa0
我正在尝试将任何文件类型的传入邮件附件保存到数据库中以供处理。
有什么想法吗?
【问题讨论】:
标签: ruby-on-rails postgresql ruby-on-rails-3 actionmailer
您要将数据保存到哪种类型的列?如果附件可以是任何类型,您需要一个 bytea 列来确保数据只是作为 blob(二进制“大”对象)传递。如其他答案中所述,该错误表明发送到 PostgreSQL 且被标记为 UTF-8 编码文本的某些数据无效。
我建议您将电子邮件附件连同其 MIME 内容类型标头一起存储为二进制文件。 Content-Type 标头应包括将二进制内容转换为有意义的附件文本所需的字符编码:例如“文本/纯文本;字符集=iso-8859-1”。
如果您希望数据库中提供解码后的文本,您可以让应用程序对其进行解码并存储文本内容,可能会为解码后的版本增加一列。例如,如果您想对电子邮件附件使用 PostgreSQL 的全文索引,这将非常有用。但是,如果您只想将它们存储在数据库中以便以后按原样检索,只需将它们存储为二进制文件,并将文本编码问题留给应用程序。
【讨论】:
0xa0 是一个不间断的空格,可能是 latin1 编码。在 Python 中,我会使用 str.decode() 和 str.encode() 将其从当前编码更改为目标编码,此处为“utf8”。但我不知道你在 Rails 中会怎么做。
【讨论】:
我不知道 Rails,但是当 PG 给出这个错误信息时,它意味着:
postgres 和 Rails 客户端之间的连接已正确配置为使用 utf-8 编码,这意味着客户端和 postgres 之间传输的所有文本数据都必须使用 utf-8 编码
并且您的 Rails 客户端错误地发送了一些以另一种编码(很可能是 latin-1 或 ISO-8859)编码的数据:因此 postgres 拒绝它
您必须查看将数据插入数据库的客户端代码,可能是您尝试插入非 unicode 字符串或发生了一些不正确的转码。
【讨论】: