2 に答える
私はついに自分の問題が何であるかを理解しました。私のデータベースはでエンコードされていましたが、元のgemをutf8
使用したアプリがテーブルにテキストを挿入していました。mysql
latin1
utf8
私を驚かせたのは、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クライアントでmysql2
gemから取得したものと一致する文字を確認しました。また、一時的にlatin1
「」に切り替えることで、このコンテンツであることを確認できました。encoding: latin1
database.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の翻訳では、特定のより複雑な文字でいくつかのことが望まれることがありますが、私のマルチバイト文字のほとんどはかなり一般的なもの(アクセント記号、引用符など)であるため、これは私にとってはうまくいきました。
これらすべてを整理する上で非常に貴重であることが証明されたいくつかのリソース:
コマンド ライン クライアントではすべて問題ないように見えますが、ターミナルの文字エンコーディングが UTF8 を表示するように設定されていない可能性があります。OS X ターミナルにチェックインするには、[ターミナル] > [設定] > [設定] > [詳細設定] > [文字エンコード] をクリックします。また、 http://dev.mysql.com/downloads/gui-tools/5.0.htmlにある MySQL Query Browser などのグラフィカル ツールを使用して確認してください。