【问题标题】:Why does ActiveRecord return fields encoded as ASCII-8BIT even with mysql2 gem?为什么即使使用 mysql2 gem,ActiveRecord 也会返回编码为 ASCII-8BIT 的字段?
【发布时间】:2011-12-14 12:48:17
【问题描述】:

我在 Ruby 1.9、Rails 3.0、ActiveRecord 3.0 中遇到了这个错误:

incompatible encoding regexp match (UTF-8 regexp with ASCII-8BIT string)

发生这种情况是因为我尝试调用gsub 的字符串(直接来自ActiveRecord 对象字段)的编码为ASCII-8BIT。看了几篇文章,帖子和答案,说这是mysql gem编码错误造成的,并提示mysql2。

但我已经在使用 mysql2。我试过0.2.x版本和最新的0.3.7版本都没有解决问题:

irb> str = Discussion.first.content
=> "Something's wrong with encodings..." 
irb> str.encoding
=> #<Encoding:ASCII-8BIT> 

我已经更改了 MySQL 中的数据库编码和表编码,我还尝试设置 LANG env 变量,但没有成功。还有其他地方我可以查看或了解为什么我得到了错误的编码吗?

【问题讨论】:

  • 这里还有一点信息:__ENCODING__、Encoding.default_external 和 Encoding.default_internal 都返回 UTF-8

标签: ruby-on-rails ruby-on-rails-3 activerecord character-encoding ruby-1.9


【解决方案1】:

啊哈!我的知识浅薄再次袭来。问题确实出在 database.yml 中:

development:
  encoding: utf8
  adapter: mysql2
  [...]

我仍在使用adapter: mysql,所以即使安装了mysql2 gem,它也没有被使用。我没有意识到我必须在database.yml 中更改它的名称;我认为它会替换旧的mysql gem。

现在我们都知道了! :)

【讨论】:

  • 注意:这在 DataMapper 项目中不起作用!我不知道为什么适配器在ActiveRecord(?)中显然被称为mysql2,但是在DataMapper项目中,在database.yml中使用mysql2只会导致错误,因为DM使用的适配器名称是mysql。 DataMapper 使用 do-mysql 驱动程序,它没有字符编码问题,因此不需要 mysql2 gem。无论如何也无济于事,因为 dm-mysql-adapter 没有使用它。
  • 我使用 MySQL 5.1.71 和 Rails 4.0.2 在 Ruby 2.0.0-p353 上运行。在 database.yml 中,所有环境的编码设置为“utf8”,适配器为“mysql2”。我的表都使用 UTF-8,“DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci”。关于我可以在哪里查看 ActiveRecord 为何将 ASCII-8BIT 字符串交给我的任何想法?
【解决方案2】:

您是否在config/database.yml 中正确设置了连接编码?

development:
  encoding: utf8

【讨论】:

  • 我不是!但是我将它添加到了我的 database.yml 文件中,它并没有改变任何东西。射击。不过感谢您的提示!
猜你喜欢
  • 2014-05-08
  • 1970-01-01
  • 2015-04-12
  • 1970-01-01
  • 2012-06-13
  • 2021-08-15
  • 1970-01-01
  • 1970-01-01
  • 2012-10-07
相关资源
最近更新 更多