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

时间:2010-11-25 22:14:04

标签: 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,而 all name中的值被解释为UTF-8。

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

以下是设置和环境:

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

任何人都知道这里发生了什么?

3 个答案:

答案 0 :(得分:0)

答案 1 :(得分:0)

我找到了解决方案,使用ruby-mysql gem而不是mysql或mysql2 gems。

答案 2 :(得分:-1)

我认为我的生活也存在同样的问题。

当我从MySQL DB rails中检索数据时,将字符串转换为float:

列“Complemento”和“estado”是DB中的字符串,尽管操作“show”表示 Complemento:0.0 - >在DB是“apto 191”

Escola成功创作。

Nome:席尔瓦布拉加

Endereco:Rua Dr Arnaldo

Numero:99

补充:0.0 - > DB是“apto 191”

Cidade:圣保罗

Estado:0.0 - > DB是“MG”

编辑|回到