我有这样的场景。
电影片名:
$ 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。
有人知道问题出在哪里吗?
发布于 2011-02-26 05:56:59
我找到了解决我的问题的办法。现在我使用较新的mysql2 gem。
我在Gemfile中用gem "mysql2"替换了gem "mysql"。
然后,我在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在我的案例中,我认为这是一个破坏交易的因素:
摘自
...It还强制对连接使用UTF-8或二进制[以及1.9...
中的所有字符串
发布于 2011-02-26 05:32:44
根据this link的说法,rails scaffolding在mysql中创建了varchar(255)列。The mysql documentation对varchar(255)的描述如下:
例如,
( 255 )列可以包含最大长度为255个字符的字符串。假设该列使用latin1字符集(每个字符一个字节),所需的实际存储空间是字符串的长度(L)加上一个字节来记录字符串的长度。
我的猜测是,数据库中的列类型不支持由多个字节表示的字符。This link有更多关于rails在处理unicode字符串时的常见缺陷的信息,更具体地说,它说您需要像这样以utf8格式创建数据库:
CREATE_DATABASE my_web_two_zero_development DEFAULT CHARSET utf8;https://stackoverflow.com/questions/5122765
复制相似问题