2013-10-11 88 views
9

在Ruby 2.0中的Rails 4.0應用程序中,土耳其字符在嘗試向數據庫中插入記錄時導致以下ActiveRecord/MySQL錯誤。有問題的字符是例如»和ş,但ü或Ç沒有問題(這似乎也出現在拉丁字符集中)。Mysql2 ::錯誤:土耳其字符的錯誤字符串值

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

的原因是顯然的數據庫(尤其是數據庫表)有錯誤的字符集。單獨切換數據庫的排序規則沒有幫助。數據庫表的檢查表明,每個表仍然有latin1的字符集,它不能存儲所有的UTF8字符:

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

所以我改變了直接的字符集表:

ALTER TABLE my_table CONVERT TO CHARACTER SET utf8; 

然後最後工作,字符集是如何utf8

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

嘗試應用force_encoding編碼保存字符串數據庫之前,你的unicode編碼字符串,土耳其將UTF-8這樣的。

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

閱讀this更多細節

+0

但字符串顯然是用UTF-8編碼?它只是不能存儲在MySQL數據庫中。 – 0x4a6f4672

+0

在mysql2的錯誤信息中,我認爲它不會像這樣(逐字節)'\ xC4 \ x9Fu \ xC5 \ x9F'如果它是UTF-8。這意味着mysql2 gem沒有把它作爲一個utf8字符串。 – Litmus