19

MySQL5.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      |
+------+-----------------+---------+

これが私が抱えている問題です

ステージング時(dbおよびRailsサイトがdebianボックスで実行されている場合)、Railsから表示されたときにシンボルの文字が正しく表示されます。たとえば、中国人民元は、データベース内に表示されているように、私のブラウザでは元として表示されていますが、å…ƒではありません。

そのデータをローカルのOSX開発マシンにダウンロードし、dbとRailsをローカルで実行すると、ステージングで表示される文字元ではなく、ブラウザーのDB(å…ƒ)内からの表現が表示されます。

私が行ったデバッグ

Content-Typeのすべてのヘッダーが各Webサーバー(ローカル、ステージング)からutf8として返されることを確認しました。

私のローカルmysqlサーバーとステージングサーバーは両方とも、デフォルトの文字セットとしてutf8を使用するように設定されています。電話をかける前に「setnames'utf8'」を使用しています。

OS X Railsホストからステージングデータベースに接続することもできますが、人民元を表す文字å…ƒが表示されます。おそらく、mysqlローカルクライアントに問題があると思いますが、問題が何であるかを理解できません。

おそらくこれは手がかりを与えるかもしれません

さらに混乱させるために、ローカルマシンのデータベースに元という文字を貼り付けると、Webブラウザで問題なく表示されます。---それでも、同じ文字をステージングデータベースに貼り付けると、?ステージングRailsサイトのページのその場所にマークを付けます。

また、OS X Railsマシンでローカルに、クエリの前に「set names'latin1'」を使用すると、すべての文字が正しく返されます。以前、これらのテーブルをlatin1として設定していましたが、これが問題になる可能性がありますか?

誰かがここで私を助けてください、私は何が悪いのかを理解しようと夢中になっています!

4

7 に答える 7

29

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スイッチの後に生成された他のコンテンツがそれによって混乱しないようにする必要があります:(

于 2008-12-06T09:01:47.507 に答える
22

database.yml適切なセクションの下にこれらの 2 行がありますか?

encoding: utf8
collation: utf8_general_ci
于 2008-12-07T12:23:45.397 に答える
2
  1. 問題は、MySQLクライアントがUTF-8をサポートしていないことをステージングする際に発生した可能性があります。
  2. ローカルのOSXrubyインストール構成で、適切な構成が宣言されていない可能性があります。MySQLデータベースの「config/database.yml」に「encoding:utf8」が必要です。ルビー環境の場合は、「config/environment.rb」に「$KCODE='u'」が必要です。
于 2008-12-06T09:05:57.467 に答える
1

もう 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

データベースの照合タイプを変更するために、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 に答える