在使用Ruby 2.0的Rails 4.0应用程序中,土耳其字符在尝试在数据库中插入记录时会导致以下ActiveRecord / MySQL错误。有问题的字符例如是ğ和ş,但是ü或Ç(也似乎发生在拉丁字符集中)没有问题。
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 |
+----------------------+-------------------+
答案 0 :(得分:20)
原因显然是数据库(尤其是数据库表)的字符集错误。仅切换数据库的整理并没有帮助。检查数据库表显示每个表仍然有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 | ..
答案 1 :(得分:0)
在将字符串保存到数据库之前,尝试应用force_encoding
将unicode编码的土耳其语字符串编码为UTF-8。
turkish_string = turkish_string.force_encoding("UTF-8")
阅读this了解更多详情