【问题标题】:best solution for Mysql error in rails 4 app 'Incorrect string value'?Rails 4应用程序“字符串值不正确”中Mysql错误的最佳解决方案?
【发布时间】:2015-02-28 05:37:51
【问题描述】:

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

'不正确的字符串值:'\xE2\x9C\x93"\x0A ...' 列'handler' 在第 1 行

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

【问题讨论】:

  • 这方面有什么更新吗?我也面临同样的问题。

标签: mysql ruby-on-rails encoding delayed-job


【解决方案1】:

今天,我发现了一个修复了一个非常相似的bug。

你说:

当我尝试直接在 mysql 中插入值时,它就像一个魅力

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

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

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

这是我编写的将rando-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

这是一篇很好的、相关的 StackOverflow 帖子,更普遍地是关于将 db 列转换为 UTF8:How to convert an entire MySQL database characterset and collation to UTF-8?

祝你好运!

【讨论】:

  • 嗨,凯文,感谢您的回复。我试过了,这很有效。但是我会因为将表格转换为 utf8 而遇到问题吗?
  • 确保使用正确的encodingcollation 选项更新您的database.yml 文件。否则,您仍然会收到此错误,并且看起来像是来自数据库。本质上,客户端也必须使用正确的字符集和排序规则值“连接”。
猜你喜欢
  • 2017-01-17
  • 2011-11-21
  • 2011-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多