此问题始于常见的“不兼容字符编码:ASCII-8BIT 和 UTF-8”问题,但这不是我要问的。相反,我发现发生此问题是因为我的数据库的某些字段在检索时被标记为 ASCII-8BIT,而大多数字段正确显示为 UTF-8。
例如,在包含列 country
和 nationality
的表格中,第 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/