我们一直在使用Rails(版本为2.3.8,Ruby版本为1.8.7,如果相关的话),一切似乎都很正常。我们MySQL版本5.5.20 DBMS中的所有表格都使用默认的latin-1字符集,这应该是可以的,因为我们没有国际用户(尽管我们的database.yml实际上指定了utf8...直到现在,没有人注意到数据库实际上并不是这样的)。
然而,我刚刚发现,在我们最后一个应用程序中,那个特定数据库中的表格正在使用utf8。我们现在正在添加到这个应用程序中,在我们的开发机器和测试服务器上,新创建的表格以哪种字符集结束似乎是完全随机的。上周五我部署到我们的测试服务器上,当时创建了两个表格,其中一个使用latin-1,另一个使用utf8。在我的机器上,它们都是utf8。由于我们在这些表格之间使用外键,这是一个问题。
我找到了大量关于修复字符集问题,从一个字符集迁移至另一个字符集等方面的信息,但没有什么可以解释为什么我们突然会遇到这个问题,以及为什么它来回切换。
这两个表格的迁移如下:
create_table :charges, :id => false do |t|
t.string :id
t.decimal :amount
t.decimal :charge
t.text :description
t.string :charge_type_ref_id
t.string :business_id
t.timestamps
end
并且
create_table :charge_type_refs, :id => false do |t|
t.string :id
t.string :name
t.string :code
t.boolean :active
t.decimal :fee
t.timestamps
end
我们的database.yml文件如下:
development:
adapter: mysql
encoding: utf8
reconnect: false
database: database_development
pool: 5
username: username
password: password
socket: /tmp/mysql.sock
我该如何停止这种情况的发生?如果必须,我将在每次迁移中指定字符集,但这似乎有点荒谬。我也想知道为什么会出现这种情况,因为这似乎非常奇怪。它只影响这个应用程序的一个数据库,而我们所有其他应用程序和数据库都是统一的。我不明白。
编辑:实际上,仔细查看所有数据库,几乎每个数据库中都有一两个utf8表。因此,问题以前就存在;只是那些表之间没有外键,所以我们以前从未注意到。然而,我们目前正在处理的数据库受到的影响要比其他数据库大得多。
接受答案中的解决方案是添加
[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci
我在我的开发机上尝试在my.cnf上的设置,结果非常成功。我多次重新创建了表格,每次都很顺利。但是当我在我们的测试服务器上尝试时,出现了问题。我通过查看SHOW VARIABLES LIKE 'char%';
和SHOW VARIABLES LIKE 'collation%';
的输出,确认了my.cnf上的设置已经生效。所有变量都设置成了应该设置的utf8或utf8_general_ci。但是,一些被创建的表格仍然以latin1编码显示。我多次尝试,结果都一样。
看来这个解决方案有时会奏效,但并不总是有效。因此,我放弃了这个方法,并在所有的表格创建迁移中添加了:options => 'DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci'
,以适用于我们的测试和开发服务器。
在联系Oracle获取支持后(最初我认为这是Rails问题,所以没有第一时间联系Oracle),结果发现对于现有的数据库,您必须查看数据库特定的字符集/校对设置。在创建新表时,这些设置将覆盖服务器级别的设置。因此,如果其他人也遇到此问题,则首先必须使用ALTER DATABASE databasename CHARACTER SET=utf8;
重置数据库为utf8。如果您还在my.cnf中添加了这些设置,则对于新数据库,它们将被创建为正确的字符集(理论上)。