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

4

我有一个使用Ruby 1.9和Rails 4的Web应用程序。 在我的本地VM(Ubuntu)上,一切正常。我的数据库和表使用utf8_unicode_ci,并且数据被良好地保存到表中并在Web应用程序页面上良好地打印出来。 我的问题出现在我的生产服务器(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中添加了config.encoding = "utf-8"
  2. 我在config/database.rb中添加了encoding: utf8
  3. 我在initialize!之前添加了这两行代码:

config/environment.rb

Encoding::default_internal = Encoding::UTF_8
Encoding::default_external = Encoding::UTF_8`

我在应用控制器中添加了一个过滤器。
  1. 我在应用控制器中添加了一个过滤器

app/controllers/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个回答

1
尝试使用utf参数创建数据库:
CREATE DATABASE `mydb` CHARACTER SET utf8 COLLATE utf8_general_ci;

谢谢。我尝试使用您的命令行重新创建了一个新的数据库,并从我的先前的数据库中导入了带有utf8的db结构。当我从我的rails应用程序添加带有特殊字符的数据时,DB中仍然有问号,因此它没有改变任何内容(但在Web应用程序上显示仍然很好)。 - Julian Le Calvez
有什么改变吗?现在在网页上显示正常了,但以前不是?只有在查看数据库时才会出现问号吗?或者没有改变,我不确定我是否理解你的意思。 - Vladan Markovic
抱歉!我想说什么都没改变。之前在网页上是好的,但在数据库中有问号。现在,我有同样的行为。很奇怪,对吧? - Julian Le Calvez

1
RoR和MySQL之间的连接需要使用utf8。请执行RoR等效的SET NAMES utf8操作。

我在application_controller.rb中完成了它 :) - Julian Le Calvez

0
问题与我的终端有关。我通过它导入了语言列表,我认为这是我的编码问题的源头。
我下载了 Sequel Pro 来管理我的数据库,所有数据都没有损坏。

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