Mysql2 ::错误:土耳其字符的字符串值不正确

时间:2013-10-11 15:58:10

标签: mysql ruby-on-rails utf-8 ruby-on-rails-4 ruby-2.0

在使用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 |
+----------------------+-------------------+

2 个答案:

答案 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了解更多详情