6

我有这种情况。

电影名称:

$ 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 一起使用。

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

4

2 回答 2

9

我找到了解决我的问题的方法。现在我正在使用较新的mysql2宝石。

我替换gem "mysql"gem "mysql2"Gemfile 内部。

然后我更改了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 中的所有字符串 [...]

于 2011-02-25T21:56:58.630 回答
0

根据此链接,rails 脚手架在 mysql 中创建 varchar(255) 列。mysql 文档中关于 varchar(255) 的内容如下:

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

我的猜测是数据库中的列类型不支持超过一个字节表示的字符。此链接包含有关处理 unicode 字符串时 rails 中常见陷阱的更多信息,更具体地说,它表示您需要将数据库创建为 utf8,如下所示:

CREATE_DATABASE my_web_two_zero_development DEFAULT CHARSET utf8;
于 2011-02-25T21:32:44.383 回答