Rails 4应用程序中Mysql错误的最佳解决方案是什么?“Incorrect string value”?

4
我有一个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中插入该值时,它像魔法一样工作。这表明问题可能出在其他地方。 那么,有人可以建议正确的方法来纠正这个问题吗?

这个问题有任何更新吗?我也遇到了同样的问题。 - Satyam Singh
1个回答

4

今天,我发现了一个非常类似的bug并进行了修复。

你说:

当我尝试直接在mysql中插入值时,它工作得很好

...不清楚你是将该值插入到模型中还是延迟处理任务的handler列中?

在我的情况下,问题在于我(旧的、遗留的)数据库中的某些列具有DEFAULT CHARSET=latin1......因此,我需要手动将它们转换为UTF8。

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

这是我编写的核心迁移代码,用于将随机的latin1表转换为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

以下是一个与将数据库列转换为UTF8更一般相关的好的StackOverflow帖子:如何将整个MySQL数据库字符集和排序规则转换为UTF-8?

祝你好运!


嗨凯文,谢谢你的回复。我尝试了这个方法,它有效。但是,因为将表格转换为utf8而遇到问题的可能性大吗? - Kriti Aggarwal
请确保使用正确的“编码”和“排序规则”选项更新您的database.yml文件。否则,您仍将收到此错误,并且它看起来像是来自数据库。实质上,客户端也必须使用正确的字符集和排序规则值进行“连接”。 - Joshua Pinter

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接