Rails上的UTF8 MySQL问题 – 使用utf8_general_ci编码问题

我有一个在MySQL 5.0.32-Debian上运行的升级Rails站点。

在这个特定的网站上,我的所有表都使用utf8 / utf8_general_ci编码。

在该数据库中,我有一些看起来像这样的数据:

 mysql> select * from currency_types limit 1,10; +------+-----------------+---------+ | code | name | symbol | +------+-----------------+---------+ | CAD | Canadian Dollar | $ | | CNY | Chinese Yuan | 元 | | EUR | Euro | € | | GBP | Pound | £ | | INR | Indian Rupees | ₨ | | JPY | Yen | ¥ | | MXN | Mexican Peso | $ | | USD | US Dollar | $ | | PHP | Philippine Peso | ₱ | | DKK | Denmark Kroner | kr | +------+-----------------+---------+ 

这是我遇到的问题

在暂存时(在debian框中运行db和Rails站点),从Rails显示时,符号的字符正确显示。 例如,中国元在我的浏览器中显示为元,而不是å…ƒ,因为它显示在数据库中。

当我将数据下载到本地OS X开发机器并在本地运行db和Rails时,我在浏览器上看到DB(å…ƒ)内部的表示,而不是我在分段中看到的字符元素。

调试我已经完成了

我确保Content-Type的所有标题都从每个网络服务器(本地,登台)返回为utf8。

我的本地mysql服务器和登台服务器都设置为使用utf8作为默认字符集。 在我打电话之前,我正在使用“设置名称’utf8’”。

我甚至可以从我的OS X Rails主机连接到我的登台数据库,我仍然看到代表人民币的字符å…ƒ。 我猜那时候,也许我的mysql本地客户端存在问题,但我无法弄清楚问题是什么。

也许这可能会带来一些线索

为了让它更令人困惑,如果我将字符元素粘贴到我本地机器上的数据库中,我会在网络浏览器中看到它。 —如果我将同一个字符粘贴到我的登台数据库中,我会得到一个? 在我的登台Rails网站上标记它在页面上的位置。

另外,如果我在查询之前使用“set names’latin1’”,我的OS X rails机器本地,这些字符都会正常返回。 我之前确实将这些表设置为latin1 – 这可能是问题吗?

有人请帮帮我,我疯了,试图弄清楚什么是错的!

AHA! 似乎我之前在latin1中编码了一些表信息,并且愚蠢地将数据库更改为utf8而不进行转换。

运行以下修复了currency_types表:

 mysqldump -u root -p --opt --default-character-set=latin1 --skip-set-charset DBNAME > DBNAME.sql mysql -u root -p --default-character-set=utf8 DBNAME < DBNAME.sql 

现在我只需要确保在latin1> utf8开关之后生成的其他内容没有搞砸了:(

你在database.yml的正确部分下面有这两行吗?

 encoding: utf8 collation: utf8_general_ci 
  1. 问题可能出在你的MySQL客户端上,它不支持UTF-8。
  2. 您的本地OSX ruby​​安assembly置可能没有声明正确的配置。 对于MySQL数据库,您应该在“config / database.yml”中使用“encoding:utf8”。 对于ruby环境,你应该在“config / environment.rb”中有“$ KCODE =’u’”。

另一种简单的方法是使用SQL Alter语句设置编码类型。 您可以使用以下bash脚本执行此操作。

 for t in $(mysql --user=root --password=admin --database=DBNAME -e "show tables";);do echo "Altering" $t;mysql --user=root --password=admin --database=DBNAME -e "ALTER TABLE $t CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;";done 

美化

  for t in $(mysql --user=root --password=admin --database=DBNAME -e "show tables";); do echo "Altering" $t; mysql --user=root --password=admin --database=DBNAME -e "ALTER TABLE $t CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;"; done 

我的数据库默认已设置为utf8,但我遇到了同样的问题。

此外,在添加以下常用元标记后,问题仍然存在:

  

然后我创建了一个专用的connection.php以确保与MySQL的所有通信都设置为charset utf8。 请注意, mysqli_set_charset($bd, 'utf8')没有-在utf8中!

这是我的Connection.php

  

另一个php文件:

  //Other stuff 

对于Rails,将以下代码段运行到rails控制台中。 它将为所有表生成一个sql。 然后登录到mysql并从rails console执行复制的sql。 它将改变所有表编码。

 schema = File.open('db/schema.rb', 'r').read rows = schema.split("\n") table_name = nil rows.each do |row| if row =~ /create_table/ table_name = row.match(/create_table "(.+)"/)[1] puts "ALTER TABLE `#{table_name}` CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci;" end end 

您可以生成一种迁移(Rails方式)来更改数据库的排序规则类型:

 rails generate migration ChangeDatabaseCollation 

然后您可以编辑生成的文件并粘贴:

 def change # for each table that will store the new collation execute: execute "ALTER TABLE my_table CONVERT TO CHARACTER SET utf8 COLLATE utf8_general_ci" end 

并运行迁移:

 rake db:migrate 

您还可以在database.yml上强制执行新的排序规则:

 development: adapter: mysql2 encoding: utf8 collation: utf8_general_ci 

有关Rails迁移的更多信息:

http://edgeguides.rubyonrails.org/active_record_migrations.html

有关排序规则类型的更多信息:

http://collat​​ion-charts.org/