Ruby on Rails - 来自 ActiveRecord 的 MySQL 中的 UTF8 编码问题
Ruby on Rails - UTF8 encoding problems in MySQL from ActiveRecord
我有一个使用 Ruby 1.9 和 Rails 4 的网络应用程序。
在我的本地 VM (ubuntu) 中,一切正常。我的数据库和 tables 正在使用 utf8_unicode_ci,数据很好地保存到 tables 中,并很好地打印在 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。但是当我在页面上显示文本时,特殊字符会正确呈现。
此外,我在 table 中导入了一个语言列表,因此语言已正确存储在数据库中(例如 français、tchèque),但是当我从网页中检索这些值时,我得到:français, tchèque
我尝试了在网上找到的 4 个解决方案(可能不是这个顺序):
- 我在config/application.rb[=54=中添加了config.encoding = "utf-8" ]
- 我在config/database.rb
中添加了编码:utf8
- 我在初始化之前添加了这两行!
config/environment.rb
Encoding::default_internal = Encoding::UTF_8
Encoding::default_external = Encoding::UTF_8`
- 我在应用程序控制器中添加了一个过滤器
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
现在我已经完成了所有这些配置,但我的问题仍然存在。好像这些修改没有影响什么。
尝试使用 utf 参数创建数据库:
CREATE DATABASE `mydb` CHARACTER SET utf8 COLLATE utf8_general_ci;
问题与我的终端有关。我通过它导入了语言列表,我认为这是我编码问题的根源。
我下载了 Sequel Pro 来管理我的数据库,我的所有数据都没有损坏。
RoR 和MySQL 之间的连接需要在utf8 中。执行相当于 SET NAMES utf8
.
的 RoR
我有一个使用 Ruby 1.9 和 Rails 4 的网络应用程序。 在我的本地 VM (ubuntu) 中,一切正常。我的数据库和 tables 正在使用 utf8_unicode_ci,数据很好地保存到 tables 中,并很好地打印在 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。但是当我在页面上显示文本时,特殊字符会正确呈现。
此外,我在 table 中导入了一个语言列表,因此语言已正确存储在数据库中(例如 français、tchèque),但是当我从网页中检索这些值时,我得到:français, tchèque
我尝试了在网上找到的 4 个解决方案(可能不是这个顺序):
- 我在config/application.rb[=54=中添加了config.encoding = "utf-8" ]
- 我在config/database.rb 中添加了编码:utf8
- 我在初始化之前添加了这两行!
config/environment.rb
Encoding::default_internal = Encoding::UTF_8
Encoding::default_external = Encoding::UTF_8`
- 我在应用程序控制器中添加了一个过滤器
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
现在我已经完成了所有这些配置,但我的问题仍然存在。好像这些修改没有影响什么。
尝试使用 utf 参数创建数据库:
CREATE DATABASE `mydb` CHARACTER SET utf8 COLLATE utf8_general_ci;
问题与我的终端有关。我通过它导入了语言列表,我认为这是我编码问题的根源。
我下载了 Sequel Pro 来管理我的数据库,我的所有数据都没有损坏。
RoR 和MySQL 之间的连接需要在utf8 中。执行相当于 SET NAMES utf8
.