この問題は、一般的に見られる「互換性のない文字エンコード:ASCII-8BITおよびUTF-8」の問題として始まりましたが、それは私が求めていることではありません。むしろ、データベースの特定のフィールドが取得時にASCII-8BITとしてタグ付けされているのに対し、ほとんどのフィールドはUTF-8として正しく表示されているため、この問題が発生していることがわかりました。
たとえば、行16の両方の列が同じ値(コピーされて貼り付けられた)を持つ列country
と、を持つテーブルでは、次のようになります。nationality
irb(main):003:0> c = Country.find(16)
irb(main):004:0> puts "#{c.name}, #{c.name.encoding}, #{c.name.bytes.to_a}"
�land Islands, UTF-8, [195, 133, 108, 97, 110, 100, 32, 73, 115, 108, 97, 110, 100, 115]
irb(main):005:0> puts "#{c.nationality}, #{c.nationality.encoding}, #{c.nationality.bytes.to_a}"
�land Islands, ASCII-8BIT, [195, 133, 108, 97, 110, 100, 32, 73, 115, 108, 97, 110, 100, 115]
同様に、単純なギブは、同じバイト、異なるプレゼンテーションをputs name
与えます。�land Islands
nationality
"\xC3\x85land Islands"
特定の列のエンコーディングは、文字列にASCII以外の文字が含まれているかどうかに関係なく一定であるように見えるため、文字列の問題だけではありません。つまり、のすべての値はnationality
ASCIIとして解釈され、のすべての値はname
UTF-8として解釈されます。
問題は単一のテーブルに限定されるものではなく、列が誤認識されるパターンは見つかりませんでした。
設定と環境は次のとおりです。
- Windows764ビット上のRails3.0.0
- データベースアダプタ:mysql2とmysqlはどちらも同じ動作を示します
- Database.ymlには
encoding: utf8
- application.rbには
config.encoding = "utf-8"
- MySQLデータベース、テーブル、および両方の列はutf8として定義されています
- MySQLの両方の列はvarchar、255であり、nullを許可します
- Railsを新しくインストールし、データベースにアクセスするために定義された国モデル以外は何もしないで、問題を再現できます。私はまだ新しい1行のデータベースを試していません。
誰もがここで何が起こっているのか知っていますか?