mysql - Rails 3,mysql/mysql2 将一些检索到的字符串错误解释为 ASCII-8BIT

标签 mysql encoding ruby-on-rails-3 character-encoding mysql2

此问题始于常见的“不兼容字符编码:ASCII-8BIT 和 UTF-8”问题,但这不是我要问的。相反,我发现发生此问题是因为我的数据库的某些字段在检索时被标记为 ASCII-8BIT,而大多数字段正确显示为 UTF-8。

例如,在包含列 countrynationality 的表格中,第 16 行的两列具有相同的值(复制粘贴),我得到

irb(main):003:0> c = Country.find(16)
irb(main):004:0> puts "#{c.name}, #{c.name.encoding}, #{c.name.bytes.to_a}"
�land Islands, UTF-8, [195, 133, 108, 97, 110, 100, 32, 73, 115, 108, 97, 110, 100, 115]
irb(main):005:0> puts "#{c.nationality}, #{c.nationality.encoding}, #{c.nationality.bytes.to_a}"
�land Islands, ASCII-8BIT, [195, 133, 108, 97, 110, 100, 32, 73, 115, 108, 97, 110, 100, 115]

同样,一个简单的 puts name 给出 �land Islands 而对于 nationality 它给出 "\xC3\x85land Islands" -- 相同的字节,不同的表示。

无论字符串是否包含非 ascii 字符,给定列的编码似乎都是不变的,因此这不仅仅是字符串的问题。也就是说,nationality 中的所有值被解释为 ascii,name 中的所有值被解释为 UTF-8。

问题不仅限于单个表,我还没有发现任何列被错误识别的模式。

这里是设置和环境:

  • Windows 7 64 位 Rails 3.0.0
  • 数据库适配器:mysql2 和 mysql 都表现出相同的行为
  • Database.yml 包括编码:utf8
  • application.rb 包括 config.encoding = "utf-8"
  • MySQL数据库,表,两列都定义为utf8
  • MySQL中两列都是varchar,255,允许null
  • 我可以通过全新安装 Rails 来重现该问题,除了定义的 Country 模型之外,什么都没有,以访问数据库。我还没有尝试过新的单行数据库。

有人知道这里发生了什么吗?

最佳答案

关于mysql - Rails 3,mysql/mysql2 将一些检索到的字符串错误解释为 ASCII-8BIT,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4281194/

相关文章:

ruby-on-rails - 您如何覆盖 Rails has_one 关联的 getter 方法?

MySQL 十进制字段 'Data truncated for column x at row 1' 问题

php - 外键未存储相关模型的实际值

mysql - 为什么已删除的行仍然出现在并发执行的 MySQL 事务中的后续选择查询中?

php - 使用 mysqli_query 进行 json 表单验证

ruby-on-rails - 我应该测试什么 "validation logic"?

java - 数据库不接受西里尔字符

version-control - 从 SVN 转换为 Mercurial (Windows) 时如何保留文件名中的特殊字符?

c - 使用 libavcodec 编码 h264 时如何限制 CPU 使用率?

javascript - kaminari 通过 ajax 分页,remote = true 不影响 rails 3 中的 View