2011-02-07 73 views
3

我正在使用Rails 3.0.3,并且已将mysql适配器从ruby-mysql更改为mysql2,但现在出现以下错误:mysql2 gem,Rails 3.0.3和“不兼容的字符编码”错误

incompatible character encodings: ASCII-8BIT and UTF-8 

我已经阅读过关于此的所有内容,但我无法解决它。

application.rb中:

config.encoding = "utf-8" 

的database.yml:

development: 
    adapter: mysql2 
    encoding: utf8 
    database: rails3_development 
    username: root 
    password: 
    host: localhost 

宝石:

specs: 
    abstract (1.0.0) 
    actionmailer (3.0.3) 
    actionpack (3.0.3) 
    activemodel (3.0.3) 
    activerecord (3.0.3) 
    activeresource (3.0.3) 
    activesupport (3.0.3) 
    arel (2.0.7) 
    bcrypt-ruby (2.1.4) 
    builder (2.1.2) 
    erubis (2.6.6) 
    i18n (0.5.0) 
    jquery-rails (0.2.6) 
    mail (2.2.15) 
    mime-types (1.16) 
    **mysql2 (0.2.6) 
    orm_adapter (0.0.4) 
    paperclip (2.3.8) 
    polyglot (0.3.1) 
    rack (1.2.1) 
    rack-mount (0.6.13) 
    rack-test (0.5.7) 
    rails (3.0.3) 
    railties (3.0.3) 
    rake (0.8.7) 
    thor (0.14.6) 
    treetop (1.4.9) 
    tzinfo (0.3.24) 
    warden (1.0.3) 
    will_paginate (3.0.pre2) 
+0

对于其他搜索者:如果您使用mysql2和blob数据类型,它将始终返回二进制。只需将您的blob字段更改为“文本”数据类型即可。它会保持编码。 – 2012-11-06 13:57:47

回答

3

我有一个类似PROBL em:具有排序规则的varchar字段utf8_bin具有ASCII-8BIT编码。

问题在于mysql2 gem,不是在Rails中,也不在mysql设置中,至少在我的情况下,因为它不会发生在ruby-mysql gem中。

当您切换到ruby-mysql时,请测试问题是否消失。

下面的代码,从IRB的红宝石1.9.2运行,演示了此问题:

require 'mysql2' 
c = Mysql2::Client.new(host: "localhost", username: "root", database: 'd') 
c.query("select word from t where word = 'a'").to_a[0]["word"].encoding 
# => #<Encoding:ASCII-8BIT> 

这其中每一个可以想象的设置已被设置为一个utf8_bin整理一个MySQL数据库上。

在mysql2宝石,在上线253 result.c文件,有下面的代码片段:

if (fields[i].flags & BINARY_FLAG) { 
    rb_enc_associate(val, binaryEncoding); 
} else ... 

我相信这就是二进制(ASCII-8BIT)编码被设定,也许是因为utf8_bin整理...我已经删除它,并解决了问题,但我相信它可能会引入其他问题,例如blob。

+0

mysql2的作者在这里回应:https://github.com/brianmario/mysql2/issues/issue/124解决方案基本上是,不要使用utf8_bin,如果你必须的话,在字段上使用force_encoding。 – 2011-02-16 04:36:03

相关问题