2
4

2 に答える 2

6

私はついに自分の問題が何であるかを理解しました。私のデータベースはでエンコードされていましたが、元のgemをutf8使用したアプリがテーブルにテキストを挿入していました。mysqllatin1utf8

私を驚かせたのは、mysqlコマンドラインクライアントからの出力が正しく見えたということでした。端末、データベースフィールド、およびMySQLクライアントがすべてで実行されていることを確認することが重要utf8です。

MySQLのクライアントはlatin1デフォルトで実行されます。次のクエリを発行することで、何が実行されているかを確認できます。

show variables like 'char%';

適切に設定されているutf8場合は、次のように表示されます。

+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

これらが正しくないように見える場合は、構成ファイルの[client]セクションで次のように設定されていることを確認してください。my.cnf

default-character-set = utf8

[mysqld]セクションに以下を追加します。

# use utf8 by default
character-set-server=utf8
collation-server=utf8_general_ci

クライアントを再起動する前に、必ずmysqlデーモンを再起動してから確認してください。

注:これにより、既存のデータベースの文字セットや照合が変更されることはありません。作成された新しいデータベースがデフォルトでにutf8表示され、クライアントがに表示されるようにするだけutf8です。

これを行った後、私はmysqlクライアントでmysql2gemから取得したものと一致する文字を確認しました。また、一時的にlatin1「」に切り替えることで、このコンテンツであることを確認できました。encoding: latin1database.conf

問題を見つけるための非常に便利なクエリの1つは、charlengthを使用してマルチバイト文字の行を見つけることです。

SELECT id, name FROM items WHERE LENGTH(name) != CHAR_LENGTH(name);

latin1コンテンツをに変換するスクリプトはたくさんありますが、utf8私にとって最も効果的なのは、すべてのデータベースをlatin1としてダンプし、コンテンツをutf8次のように詰め込むことでした。

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

最初にプライマリデータベースをバックアップし、次にテストデータベースにダンプして、修正されたDBにロールオーバーする前に狂ったように検証しました。

私の理解では、MySQLの翻訳では、特定のより複雑な文字でいくつかのことが望まれることがありますが、私のマルチバイト文字のほとんどはかなり一般的なもの(アクセント記号、引用符など)であるため、これは私にとってはうまくいきました。

これらすべてを整理する上で非常に貴重であることが証明されたいくつかのリソース:

于 2013-03-02T20:13:42.003 に答える
1

コマンド ライン クライアントではすべて問題ないように見えますが、ターミナルの文字エンコーディングが UTF8 を表示するように設定されていない可能性があります。OS X ターミナルにチェックインするには、[ターミナル] > [設定] > [設定] > [詳細設定] > [文字エンコード] をクリックします。また、 http://dev.mysql.com/downloads/gui-tools/5.0.htmlにある MySQL Query Browser などのグラフィカル ツールを使用して確認してください。

于 2013-02-27T03:15:57.493 に答える