【问题标题】:Ruby on Rails - UTF8 encoding problems in MySQL from ActiveRecordRuby on Rails - 来自 ActiveRecord 的 MySQL 中的 UTF8 编码问题
【发布时间】:2015-08-16 09:20:29
【问题描述】:

我有一个使用 Ruby 1.9 和 Rails 4 的网络应用程序。 在我的本地虚拟机(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çais, tchèque

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

  1. 我在 config/application.rb 中添加了 config.encoding = "utf-8"
  2. 我在 config/database.rb 中添加了 encoding: utf8
  3. 我在初始化之前添加了这两行!

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

现在我有了所有这些配置,但我的问题还是一样。好像这些修改没有影响任何东西。

【问题讨论】:

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


    【解决方案1】:

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

    CREATE DATABASE `mydb` CHARACTER SET utf8 COLLATE utf8_general_ci;
    

    【讨论】:

    • 谢谢。我尝试使用您的命令行重新创建一个新数据库,并从我以前的数据库中导入了数据库结构(使用 utf8)。当我从我的 rails 应用程序中添加带有特殊字符的数据时,我的数据库中仍然有问号,所以它没有改变任何东西(但在 web 应用程序上显示仍然很好)。
    • 有什么改变吗?显示现在在网络上很好,但以前不是?只有当您查看 DB 内部时,您才会得到问号?或者没有任何改变,我不确定我是否理解正确。
    • 对不起!我想说什么都没有改变。在网络上还可以,但在数据库中有问号。而现在,我也有同样的行为。很奇怪,对吧?
    【解决方案2】:

    问题与我的终端有关。我通过它导入了语言列表,我认为这是我的编码问题的根源。

    我下载了 Sequel Pro 来管理我的数据库,并且我的所有数据都没有损坏。

    【讨论】:

      【解决方案3】:

      RoR 和 MySQL 之间的连接需要是 utf8 格式。执行 SET NAMES utf8 的 RoR 等效项。

      【讨论】:

      • 我是在 application_controller.rb 中完成的 :)
      猜你喜欢
      • 2016-02-23
      • 1970-01-01
      • 2010-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-22
      • 1970-01-01
      相关资源
      最近更新 更多