我正在将Rails 3.2.13应用程序从Ruby 1.8.7-p370升级到Ruby 1.9.3-p385。升级后,特殊字符在从数据库检索到的文本中出现乱码。例如“café”显示为“café”。我的数据库是latin1编码的。我使用mysql2(0.3.11)和我database.yml
这个样子的:从Ruby 1.8.7升级到1.9.3的Rails 3应用停止尊重database.yml中的latin1编码规范
development:
adapter: mysql2
encoding: latin1
database: my_db
username: root
host: localhost
(同样的问题也发生在生产环境中,具有相同的数据库配置。)
看样子当ActiveRecord从数据库中检索文本时,它将它解码为utf-8,而不是像我指定的那样对latin1(或ISO-8859-1)进行解码。
要诊断的问题,我写了一个Ruby脚本,使用mysql2直接查询数据库,绕过ActiveRecord的:
require 'rubygems'
require 'mysql2'
client = Mysql2::Client.new(:host => "localhost",
:username => "root",
:database => "food52_development_production",
:encoding => "latin1")
result = client.query('SELECT title FROM recipes WHERE id = 12934')
puts result.first["title"]
ID为12934配方在其标题中注明“咖啡馆”。在1.9.3中运行此脚本会输出正确解码的文本(“café”)。如果我将:encoding
选项更改为"utf-8"
,我会再次看到乱码文本(“café”)。
我也尝试在ActiveRecord::ConnectionAdapters
中放置一个断点,以了解如何使用什么编码配置Rails初始化Mysql2::Client
。正如预期的那样,它正在通过。
然而:Rails决定将文本解码为utf-8。我如何让Rails尊重我指定的latin1编码配置?在此先感谢您的帮助。
什么是您的系统规格? – tylerdavis 2013-03-20 16:14:06
@tylerdavis,我正在运行OS X 10.8.2,但同样的问题发生在Ubuntu的生产环境中。 – hoffm 2013-03-20 16:18:04