19

我有一个在 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 作为默认字符集。在我拨打任何电话之前,我正在使用“set names 'utf8'”。

我什至可以从我的 OS X Rails 主机连接到我的暂存数据库,我仍然可以看到代表人民币的字符 å...ƒ。那我猜,也许我的mysql本地客户端有问题,但我不知道是什么问题。

也许这可能会提供线索

更令人困惑的是,如果我将字符元粘贴到本地计算机上的数据库中,我会在网络浏览器中看到它很好。--- 然而,如果我将相同的字符粘贴到我的暂存数据库中,我会得到一个 ? 在我的暂存 Rails 站点的页面上标记它的位置。

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

有人请在这里帮助我,我要疯了,试图找出问题所在!

4

7 回答 7

29

啊哈!似乎我之前有一些用 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 开关之后生成的其他内容不会因此而混乱:(

于 2008-12-06T09:01:47.507 回答
22

database.yml在适当的部分下有这两行吗?

encoding: utf8
collation: utf8_general_ci
于 2008-12-07T12:23:45.397 回答
2
  1. 问题可能出在您的 MySQL 客户端上,它不支持 UTF-8。
  2. 您的本地 OSX ruby​​ 安装配置可能没有声明正确的配置。MySQL 数据库的“config/database.yml”中应该有“encoding:utf8”。对于 ruby​​ 环境,您应该在“config/environment.rb”中有“$KCODE = 'u'”。
于 2008-12-06T09:05:57.467 回答
1

另一种简单的方法是使用SQLAlter 语句设置编码类型。您可以使用以下 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
于 2013-04-18T09:36:22.303 回答
0

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

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

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

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

这是我的Connection.php

<?php
    $mysql_hostname = "localhost";
    $mysql_user = "username";
    $mysql_password = "password";
    $mysql_database = "dbname";
    $prefix = "";
    $bd = mysqli_connect($mysql_hostname, $mysql_user, $mysql_password) or die("Could not connect database");
    mysqli_select_db($bd, $mysql_database) or die("Could not select database");
    if(!mysqli_set_charset($bd, 'utf8'))  {
        exit() ;
    }
?>

另一个php文件:

<?php
    //Include database connection details
    require_once('connection.php');

    //Enter code here...

    //Create query
    $qry = "SELECT * FROM subject";
    $result = mysqli_query($bd, $qry);
?>

//Other stuff
于 2014-11-07T07:15:35.317 回答
0

对于 Rails,将以下代码片段运行到 rails 控制台。它将为所有表生成一个 sql。然后登录mysql并从rails控制台执行复制的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
于 2015-04-15T07:57:46.857 回答
0

您可以使用 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/

于 2015-11-27T13:58:35.430 回答