MySQL将UTF-8更改为ASCII-8BIT

时间:2011-02-25 21:18:37

标签: mysql ruby-on-rails utf8-decode

我有这种情况。

电影名称:

$ title = "La leyenda de Osaín"

使用此编码:

$ title.encoding.name
>> UTF-8

然后我将其保存到数据库中。

$ movie = Movie.create!(:title => title)

然后我尝试拍电影。

$ Movie.find(movie.id).title.encoding.name
>> "ASCII-8BIT"

$ Movie.find(movie.id).title
>> "La leyenda de Osa\xC3\xADn"

所有其他电影的作品不包含íû等特殊字符。

这是我的database.yaml文件:

development:
  adapter: mysql
  database: development
  username: linus
  password: my_password
  socket: /tmp/mysql.sock
  encoding: UTF8

使用forced_encoding时,我得到了正确的数据。

$ Movie.find(movie.id).title.force_encoding("UTF-8")
>> "La leyenda de Osaín"

我正在使用Rails 3.0.5.rc1和MySQL 14.14。

任何人都知道问题可能是什么?

2 个答案:

答案 0 :(得分:9)

我找到了解决问题的方法。 现在我正在使用更新的mysql2 gem。

我在Gemfile中用gem "mysql"替换了gem "mysql2"

然后我更改了database.yaml文件中的数据库适配器

自:

development:
  adapter: mysql
  database: development
  username: linus
  password: my_password
  socket: /tmp/mysql.sock
  encoding: UTF8

要:

  development:
    adapter: mysql2
    database: development
    username: linus
    password: my_password
    socket: /tmp/mysql.sock
    encoding: UTF8

我认为这是我案中的交易破坏者:

取自Github MySQL2

  

[...]它还强制使用UTF-8 [或二进制]进行连接[以及1.9 [...]

中的所有字符串

答案 1 :(得分:0)

根据this link,rails scaffolding在mysql中创建varchar(255)列。 The mysql documentation说明以下关于varchar(255)的内容:

  

例如,VARCHAR(255)列可以   持有一个最大长度为的字符串   255个字符。假设那个   column使用latin1字符集   (每个字符一个字节),实际   所需的存储空间是   字符串(L),加上一个要记录的字节   字符串的长度。

我的猜测是数据库中的列类型不支持由多个字节表示的字符。在处理unicode字符串时,This link提供了有关rails中常见陷阱的更多信息,更具体地说,它表示你需要像utf8一样创建数据库:

CREATE_DATABASE my_web_two_zero_development DEFAULT CHARSET utf8;