Rails迁移突然随机创建具有不同字符集的表

5

我们一直在使用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中添加了这些设置,则对于新数据库,它们将被创建为正确的字符集(理论上)。

1个回答

4

太高兴听到这个消息了,我开始觉得自己快要疯了...我已经读过关于服务器设置的内容,但在弄清楚这件事情之前一直担心着。谢谢,我会尝试一下的。还有感谢提供链接,我在大量搜索中竟然没有看到它。 - Maltiriel
接受这个结果,因为我在将设置添加到my.cnf后尝试重新创建了所有表格,看起来它已经起作用了。所有的表格都是utf8,并且采用了utf8_unicode_ci排序规则。谢谢。 - Maltiriel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接