MySQL将UTF-8更改为ASCII-8BIT
我有这种情况。
电影名称:
$ 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。
谁知道问题可能是什么?
我找到了解决问题的方法。 现在我正在使用更新的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
我认为这是我案中的交易破坏者:
取自Github MySQL2
[…]它还强制使用UTF-8 [或二进制]进行连接[以及1.9 […]中的所有字符串
根据此链接 ,rails scaffolding在mysql中创建varchar(255)列。 mysql文档说明了以下关于varchar(255)的内容:
例如,VARCHAR(255)列可以包含最大长度为255个字符的字符串。 假设该列使用latin1字符集(每个字符一个字节),所需的实际存储量是字符串(L)的长度,加上一个字节来记录字符串的长度。
我的猜测是数据库中的列类型不支持由多个字节表示的字符。 在处理unicode字符串时, 此链接提供了有关rails中常见陷阱的更多信息,更具体地说,它表示您需要将数据库创建为utf8,如下所示:
CREATE_DATABASE my_web_two_zero_development DEFAULT CHARSET utf8;
- Rails选择子查询(如果可能的话,没有finder_sql)
- 尝试使用rake db创建数据库时出现此错误:在Google上创建可以SQL服务器
- 我的应用程序访问远程数据库。 如何有效地运行unit testing?
- 在rails中创建新对象时出错
- 安装mysql2 gem时出错:无法构建gem原生扩展
- 使用Ruby / Chef Recipe for Vagrant导入Mysql数据库
- Rails 3.2 + MySQL:错误:字段’created_at’没有默认值:INSERT INTO
- ln:/usr/lib/libmysqlclient.18.dylib:文件存在
- Rails和MySQL语法错误与执行块中的多个SQL语句