2013-10-11 23 views
9

Ruby 2.0のRails 4.0アプリケーションでは、データベースにレコードを挿入しようとするとトルコ語文字が次のActiveRecord/MySQLエラーになります。問題の文字は、例えば、とşですが、üやÇ(これはラテン文字セットでも起こりそうです)に問題はありません。Mysql2 :: Error:トルコ文字の文字列値が正しくありません

ActiveRecord::StatementInvalid (Mysql2::Error: Incorrect string value: 
           '\xC4\x9Fu\xC5\x9F ...' for column ... 

このエラーを防ぐにはどうすればよいですか?アプリケーションとデータベースは、標準エンコーディングとしてUTF-8を使用します。 "xC4 \ x9F"は "»"のUTF-8エンコーディング、 "\ xC5 \ x9F"は "ş"のUTF-8です。どちらも問題のある特殊文字のようです。ドイツ語(ööü)またはフランス語(áà)の特殊文字に問題はありません。 ISO 8859-1またはISO 8859-15とは対照的に(ISO 8859-9はすべてのトルコ文字をサポートしています)、Turkish characters in UTF-8を保存する必要があります。

データベースのMySQL収集設定は次のとおりです。 collection_databaseを別の値(utf8_unicode_ciなど)に切り替えると便利ですか?

mysql> show variables like '%collation%'; 
+----------------------+-------------------+ 
| Variable_name  | Value    | 
+----------------------+-------------------+ 
| collation_connection | utf8_general_ci | 
| collation_database | latin1_swedish_ci | 
| collation_server  | latin1_swedish_ci | 
+----------------------+-------------------+ 

答えて

19

理由は、データベース(特にデータベーステーブルが)間違った文字セットを持っていたことを明らかにしました。データベースの照合だけを切り替えるだけでは役に立ちませんでした。

mysql> show table status; 
+----------+--------+-------------------+ .. 
| Name  | Engine | Collation   | .. 
+----------+--------+-------------------+ .. 
| my_table | InnoDB | latin1_swedish_ci | .. 

は、したがって、私は直接テーブルの文字セットを変更:

ALTER TABLE my_table CONVERT TO CHARACTER SET utf8; 

そして、それをデータベーステーブルの検査は、各テーブルには、まだすべてのutf8文字を格納することはできませんLATIN1文字セットを、持っていたことが示されました最終的にはうまくいっていて、文字セットはどのようにutf8

mysql> show table status; 
    ... +-------------------+ .. 
    ... | Collation   | .. 
    ... +-------------------+ .. 
    ....| utf8_general_ci | .. 
0

データベースに文字列を保存する前に、次のようにUTF-8にあなたのUnicodeのトルコ語の文字列をエンコードするためにforce_encodingを適用してみます。詳細は

turkish_string = turkish_string.force_encoding("UTF-8") 

読むthis

+0

文字列は明らかにUTF-8でエンコードされていますか? MySQLデータベースには格納できません。 – 0x4a6f4672

+0

mysql2のエラーメッセージで、UTF-8の場合は、このような(バイト単位の) '\ xC4 \ x9Fu \ xC5 \ x9F'とは思えません。これは、mysql2 gemがutf8文字列として取得しなかったことを意味します。 – Litmus

関連する問題