10

在带有 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支持所有土耳其语字符)相反,应该可以将土耳其语字符存储在 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 |
+----------------------+-------------------+
4

2 回答 2

21

原因显然是数据库(尤其是数据库表)的字符集错误。单独切换数据库的排序规则并没有帮助。检查数据库表显示每个表仍然有 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   | ..
于 2013-10-11T16:41:37.077 回答
0

在将字符串保存到数据库之前,尝试force_encoding像这样将您的 unicode 编码的土耳其字符串编码为 UTF-8。

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

阅读本文了解更多详情

于 2013-10-11T16:09:33.807 回答