【问题标题】:Rails / MySQL weird UTF-8 encoding issueRails / MySQL 奇怪的 UTF-8 编码问题
【发布时间】:2015-07-31 08:35:32
【问题描述】:

我有一个使用西里尔(马其顿)字母的应用程序。我有一个包含所有字母的字母菜单(手动输入为我从助手调用它的数组),它链接到第一个字符是该字母的项目。因此,似乎“К”和“Ќ”(也称为“Г”和“Ѓ”)列出了相同的项目,就好像它们使用相同的字母一样。在开发中效果很好,不知道为什么它在生产中这样做。我在生产数据库上设置了 UTF-8 编码。

这是产品日志。它没有得到相同的字符。

App 18197 stderr: Started GET "/letterfilter?title=%D0%8C" for IP at2015-07-30 12:03:46 -0400
App 18197 stderr: Processing by PostsController#letterfilter as HTML
App 18197 stderr:   Parameters: {"title"=>"Ќ"}
App 18197 stderr:   Rendered posts/letterfilter.html.haml within layouts/application (4.3ms)
App 18197 stderr:   Rendered posts/_search.html.haml (0.8ms)
App 18197 stderr:   Rendered shared/_header.html.haml (9.6ms)
App 18197 stderr:   Rendered shared/_footer.html.haml (0.2ms)
App 18197 stderr: Completed 200 OK in 18ms (Views: 16.6ms | ActiveRecord: 0.2ms)

App 18197 stderr: Started GET "/letterfilter?title=%D0%9A" for IP at 2015-07-30 12:03:51 -0400
App 18197 stderr: Processing by PostsController#letterfilter as HTML
App 18197 stderr:   Parameters: {"title"=>"К"}
App 18197 stderr:   Rendered posts/letterfilter.html.haml within layouts/application (4.9ms)
App 18197 stderr:   Rendered posts/_search.html.haml (0.7ms)
App 18197 stderr:   Rendered shared/_header.html.haml (7.7ms)
App 18197 stderr:   Rendered shared/_footer.html.haml (0.2ms)
App 18197 stderr: Completed 200 OK in 17ms (Views: 14.2ms | ActiveRecord: 0.9ms)

什么可能导致此问题?我应该将我的数据库编码更新为 utf8mb4 吗?

欢迎任何帮助。谢谢。

【问题讨论】:

  • 如果mysql或者rails的问题结束了?
  • @ManishShrivastava 我不确定,真的。它在本地服务器上按预期工作,但在生产环境中不同。

标签: mysql ruby-on-rails encoding utf-8


【解决方案1】:

Ќ 是 utf8 或 utf8mb4 中的十六进制 D08C。西里尔字母完全被CHARACTER SET 覆盖。 К 是D09A,可以在?title= 中看到

嗯,这很有趣:

mysql> SELECT 'К' = 'Ќ' COLLATE utf8_bin AS bin,
              'К' = 'Ќ' COLLATE utf8_general_ci AS general,
              'К' = 'Ќ' COLLATE utf8_unicode_ci AS unicode;
+-----+---------+---------+
| bin | general | unicode |
+-----+---------+---------+
|   0 |       1 |       0 |
+-----+---------+---------+

mysql> SELECT 'Г' = 'Ѓ' COLLATE utf8_bin AS bin,
              'Г' = 'Ѓ' COLLATE utf8_general_ci AS general,
              'Г' = 'Ѓ' COLLATE utf8_unicode_ci AS unicode;
+-----+---------+---------+
| bin | general | unicode |
+-----+---------+---------+
|   0 |       1 |       0 |
+-----+---------+---------+

位模式不同,因此 utf8_bin 排序不相等。但通常只要 general 相等,unicode 也一样。

回到你的问题......你是什么意思“它没有得到相同的字符”?

【讨论】:

  • 谢谢。通过没有获得相同的字符,我的意思是当我选择“Ќ”时它不仅呈现“Ќ”项目,而且还呈现“К”。我有点搞砸了我的解释,对不起,如果它令人困惑。我会尝试再解决一次,或者我会更新到 Postgre,希望它不会有同样的问题。 :)
  • utf8(或utf8mb4)需要在 MySQL 内部和外部的多个地方指定。 Ќ 是否错误地显示为 К(西里尔字母 KA,而不是拉丁字母 K)?我不认为SELECT 每个人都能做出这样的改变;我怀疑显示机制有问题。
  • К 和 Ќ 都显示相同的结果,即以这些字母开头的项目。这是查询,节目是通常的设置。 def letterfilter @letter = Post.where(["title like ? AND approved IS TRUE", "#{params[:title]}%"]) end 编辑:格式
  • 如果有帮助,这里是来自字母助手的方法。 def alphabet cyrillic_alphabet = ["А", "Б", "В", "Г", "Д", "Ѓ", "Е", "Ж", "З", "Ѕ", "И", "Ј", "К", "Л", "Њ", "М", "Н", "Љ", "О", "П", "Р", "С","Т", "Ќ", "У", "Ф", "Х", "Ц", "Ч", "Џ", "Ш"] end
  • 您将省略 D086 1030=x0406 [І] L 西里尔大写字母白俄罗斯-乌克兰语 I D087 1031=x0407 [Ї] L 西里尔大写字母 YI D08B 1035=x040B [Ћ] L 西里尔大写字母TSHE D08E 1038=x040E [Ў] L 西里尔大写字母短 U(可能还有其他)? (我不熟悉西里尔字母的细节。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-23
  • 2018-02-16
  • 2014-08-20
  • 2010-12-15
  • 1970-01-01
  • 2010-12-01
相关资源
最近更新 更多