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

0x4*_*672 10 mysql ruby-on-rails utf-8 ruby-2.0 ruby-on-rails-4

在使用Ruby 2.0的Rails 4.0应用程序中,土耳其语字符在尝试在数据库中插入记录时导致以下ActiveRecord/MySQL错误.有问题的字符例如是ğ和ş,但是ü或Ç(也似乎发生在拉丁字符集中)没有问题.

ActiveRecord::StatementInvalid (Mysql2::Error: Incorrect string value: 
                               '\xC4\x9Fu\xC5\x9F ...' for column ...
Run Code Online (Sandbox Code Playgroud)

你如何防止这个错误?应用程序和数据库使用UTF-8作为标准编码."xC4\x9F"是"ğ"的UTF-8编码,"\ xC5\x9F"是"ş"的UTF-8.两者似乎都是有问题的特殊人物.德语(äöü)或法语(áàâ)特殊字符没有问题.与ISO 8859-1或ISO 8859-15(仅ISO 8859-9支持所有土耳其语字符)相反,应该可以以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 |
+----------------------+-------------------+
Run Code Online (Sandbox Code Playgroud)

0x4*_*672 20

原因显然是数据库(尤其是数据库表)的字符集错误.仅切换数据库的整理并没有帮助.检查数据库表显示每个表仍然有latin1字符集,它不能存储所有utf8字符:

mysql> show table status;
+----------+--------+-------------------+ ..
| Name     | Engine | Collation         | ..
+----------+--------+-------------------+ ..
| my_table | InnoDB | latin1_swedish_ci | ..
Run Code Online (Sandbox Code Playgroud)

因此我直接更改了表的字符集:

ALTER TABLE my_table CONVERT TO CHARACTER SET utf8;
Run Code Online (Sandbox Code Playgroud)

然后它终于工作了,字符集是如何utf8

   mysql> show table status;
    ... +-------------------+ ..
    ... | Collation         | .. 
    ... +-------------------+ ..
    ....| utf8_general_ci   | ..
Run Code Online (Sandbox Code Playgroud)