Ruby on Rails - 来自ActiveRecord的MySQL中的UTF8编码问题

时间:2015-06-02 14:10:41

标签: mysql ruby-on-rails utf-8 character-encoding

我有一个使用Ruby 1.9和Rails 4的webapp。 在我的本地VM(ubuntu)中,一切都还可以。我的数据库和表格使用utf8_unicode_ci,数据很好地保存在表格中,并且很好地打印在webapp页面上。 我的问题出在我的生产服务器上(AWS上的EB)。我正在使用MySQL,我的数据库是瑞典语格式的,因此我使用以下命令将其转换为UTF8:

# for my database
ALTER DATABASE xxx CHARACTER SET utf8 COLLATE utf8_unicode_ci; 

# for each tables in the DB (didn’t affect a join table that I have but doesn’t matter)
ALTER TABLE xxx CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;

但是我的rails表格中包含特殊字符的所有数据都会带有问号,例如 caract?res sp?ciaux 。但是当我在页面上显示文本时,会正确呈现特殊字符。

此外,我在表格中导入了一系列语言,因此语言正确存储在数据库中(例如françaistchèque),但是当我检索这些值时从网页上我得到了:françaistchèque

我尝试了4种在互联网上找到的解决方案(可能不按此顺序):

  1. 我在 config / application.rb
  2. 中添加了 config.encoding =“utf-8”
  3. 我在 config / database.rb
  4. 中添加了 encoding:utf8
  5. 我在初始化之前添加了这两行!
  6. 到config / environment.rb

    Encoding::default_internal = Encoding::UTF_8
    Encoding::default_external = Encoding::UTF_8`
    
    1. 我在app控制器中添加了一个过滤器
    2. 应用程序/控制器/ application_controller.rb

        before_filter :configure_charsets
        # Prevent CSRF attacks by raising an exception.
        # For APIs, you may want to use :null_session instead.
        protect_from_forgery with: :exception
        def configure_charsets
          response.headers["Content-Type"] = "text/html; charset=utf-8"
          suppress(ActiveRecord::StatementInvalid) do 
            ActiveRecord::Base.connection.execute 'SET NAMES UTF8'
          end
        end
      

      现在我有了所有这些配置,但我的问题仍然是一样的。这些修改就像没有任何影响一样。

3 个答案:

答案 0 :(得分:1)

尝试使用utf params创建数据库:

heroku run

答案 1 :(得分:1)

RoR和MySQL之间的连接需要在utf8中。 RoR等效于SET NAMES utf8

答案 2 :(得分:0)

The problem was linked to my terminal. I imported the language list through it and I think this was the source of my encoding problem.

I downloaded Sequel Pro to manage my database and all of my data are not corrupted.