rails 4 应用 'Incorrect string value' 中 Mysql 错误的最佳解决方案?

best solution for Mysql error in rails 4 app 'Incorrect string value'?

我有一个 rails 应用程序,我在其中使用“delayed_job_active_record”gem 来运行后台作业。在对对象使用“.delay”方法时,出现以下 mysql 错误: **

‘Incorrect string value: '\xE2\x9C\x93"\x0A ...' for column 'handler' at row 1

** 我已经搜索了上述错误,发现这是因为 mysql 和 rails 中的编码不同。许多程序员建议的解决方案是将 mysql 数据库中的编码更改为 utf8。 但我也 read MySQL 的 utf8 字符集仅部分实现了正确的 UTF-8 编码。它只能存储由一到三个字节组成的 UTF-8 编码符号;不支持占用四个字节的编码符号。这在其他一些情况下可能会造成麻烦。此外,当我尝试将值直接插入 mysql 时,它的效果非常好。建议问题可能出在其他地方。 那么,任何人都可以建议正确的方法来纠正这个问题吗?

今天,我发现了一个非常相似的错误。

你说:

when I tried to insert the value directly in mysql, it worked like a charm

...不清楚您是将值插入到模型中,还是插入到 DelayedJob#handler 列中?

在我的例子中,问题是,我的(旧的,遗留的)数据库中的某些列有 DEFAULT CHARSET=latin1 ...所以,我需要手动将它们转换为 UTF8。

具体来说,调用 .delay 的模型是 UTF8,但 delayed_jobs table 是 latin1。因此,只有当应用程序序列化 UTF8 模型并尝试将其插入 delayed_jobs table 的 latin1 handler 列时,才会引发异常。有点棘手。

这是我编写的用于将 rando-latin1 tables 转换为 utf8 的迁移的核心:

%w( table1
table2
table3 ).each do |latin1_table_with_char_columns|
  execute("ALTER TABLE #{latin1_table_with_char_columns} CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;")
end

这是一个很好的相关 Whosebug post,它更普遍地涉及将 db 列转换为 UTF8:How to convert an entire MySQL database characterset and collation to UTF-8?

祝你好运!