我们已经使用Rails(版本2.3.8,Ruby版本1.8.7,如果它相关)已经有一段时间了,而且一切似乎都运行正常。我们的MySQL版本5.5.20 DBMS中的所有表都使用默认的latin-1字符集,我猜这很好,因为我们没有国际用户(尽管我们的database.yml实际上指定了utf8 ...没人注意到这些数据库在此之前并未实际出现过。)
但是我刚刚发现,对于我们最后一个应用程序,该特定数据库中的表使用的是utf8。我们现在正在添加到这个应用程序,在我们的开发机器和测试服务器上,似乎完全随机的是哪个charset新创建的表最终。星期五我部署到我们的测试服务器,当时创建了两个表,其中一个使用latin-1,另一个使用utf8。在我的机器上,他们都是utf8。由于我们在这些表之间使用外键,这是一个问题。
我在fixing charset issues,migrating from one charset to another等上发现了很多信息,但没有解释为什么我们突然遇到这个问题,以及它为什么会这样做来回切换。
两个表的迁移是
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问题,这就是为什么我一开始就没有这样做),事实证明,对于现有数据库,你必须查看数据库特定的字符集/整理设置。这些在创建新表时会覆盖服务器级设置。因此,如果有其他人遇到此问题,首先您必须使用ALTER DATABASE databasename CHARACTER SET=utf8;
将数据库重置为utf8。如果你还在my.cnf中添加设置,那么对于新的数据库,它们将在理论上用正确的字符集创建。
答案 0 :(得分:3)
我怀疑需要在服务器端设置charset。我有这样的问题,直到根据文档在/etc/mysql/my.cnf中设置charset:
http://dev.mysql.com/doc/refman/5.0/en/charset-applications.html
[mysqld]
character-set-server = utf8
collation-server = utf8_general_ci
这里也很好讨论 Change MySQL default character set to UTF-8 in my.cnf? https://dba.stackexchange.com/questions/8288/how-to-configure-global-charset-on-mysql