遇到了字符集编码不一致问题,导致数据库不支持中文,原因是这样的
首先,我们安装的mysql默认编码是latin1,尽管我们之前在database.yml中指定了encoding: utf8 书上对这个属性的解释为 : encoding :数据库所采用的字符集编码,默认为utf8 但这个好像没起到作用,如果有人知道这个起什么作用请告诉我,方便我们互相学习
我们之前没有修改mysql的默认字符集,
rake db:charset这条命令用于检索当前环境下数据库的字符设置,当我们使用命令rake db:create创建数据库时,rails会自动检索数据库字符集,当然,此时我们的字符集是默认的latin1
当mysql处于默认配置时,分别执行两此操作 操作一:
drop table tb_tt; CREATE TABLE tb_tt ( id int(11) DEFAULT NULL, ctnr varchar(60) DEFAULT NULL ) ENGINE=InnoDB default charset=utf8; insert into tb_tt(id,ctnr) values(1,'新華網'); 结果是插入成功操作二:
drop table tb_tt; CREATE TABLE tb_tt ( id int(11) DEFAULT NULL, ctnr varchar(60) DEFAULT NULL ) ENGINE=InnoDB charset=latin1; insert into tb_tt(id,ctnr) values(1,'新華網');结果是插入失败
我们发现,影响结果的因素是charset这个参数
接下来我们执行了$ rails generate scaffold user name:text password:text 又执行了rake db:migrate 这个时候问题来了,在执行rake db:migrate之后,打开db—->schema.rb 我们会发现里面放着创建表的代码,比如这一段
create_table "users", force: :cascade, options: "ENGINE=InnoDB DEFAULT CHARSET=latin1" do |t| t.text "name" t.text "password" t.datetime "created_at", null: false t.datetime "updated_at", null: false终于找到了罪魁祸首,这段创建数据库的代码里的charset参数是latin1 !!!! 我们可以判断出来,这里的charset参数与执行rake db:charset的返回结果有关系,或者说,这里的参数就算上面这条命令的返回结果
总结一下,由于mysql的默认字符集是latin1,导致rake db:create创建的数据库字符集是latin1,进而导致rake db:migrate过程中创建的表的字符集是latin1
数据库的字符设置是这样的
show variables like '%character_set%'; +--------------------------+----------------------------+ | Variable_name | Value | +--------------------------+----------------------------+ | character_set_client | utf8 | | character_set_connection | utf8 | | character_set_database | latin1 | | character_set_filesystem | binary | | character_set_results | utf8 | | character_set_server | latin1 | | character_set_system | utf8 | | character_sets_dir | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+这里每一项都有各自的含义。。 关于字符集的解释,发现一篇很好的博客 关于字符集的相关知识
