Ruby on Rails学习笔记(六 神挡杀神佛挡杀佛------数据库字符集问题)

遇到了关于字符集的问题


遇到了字符集编码不一致问题,导致数据库不支持中文,原因是这样的

首先,我们安装的mysql默认编码是latin1,尽管我们之前在database.yml中指定了encoding: utf8
书上对这个属性的解释为 :
encoding :数据库所采用的字符集编码,默认为utf8
但这个好像没起到作用,如果有人知道这个起什么作用请告诉我,方便我们互相学习


1 mysql默认字符集为latin1而不是utf8

我们之前没有修改mysql的默认字符集,

rake db:charset

这条命令用于检索当前环境下数据库的字符设置,当我们使用命令rake db:create创建数据库时,rails会自动检索数据库字符集,当然,此时我们的字符集是默认的latin1

2.mysql常识普及

当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这个参数

3. 执行rake db:migrate时会在数据库中创建表,并指定表的字符集

接下来我们执行了$ 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

4.真相浮出水面

终于找到了罪魁祸首,这段创建数据库的代码里的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/ |
+--------------------------+----------------------------+

这里每一项都有各自的含义。。
关于字符集的解释,发现一篇很好的博客
关于字符集的相关知识

5.解决问题

1.修改mysql默认字符集为utf8
在这里要修改的地方是etc/mysql.cnf
打开mysql.cnf,发现里面这样写着
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
算了,直接说重点
    1.mysql/conf.d/mysql.cnf 在[mysql]一句话,如下
        [mysql]
        default-character-set=utf8
    2.mysql/mysql.conf.d/mysqld.cnf
    在[mysqld]最后一行添加character-set-server=utf8
    如下所示

    [mysqld]
    #
    # * Basic Settings
    #
    user        = mysql
    pid-file    = /var/run/mysqld/mysqld.pid
    socket      = /var/run/mysqld/mysqld.sock
    port        = 3306
    basedir     = /usr
    datadir     = /var/lib/mysql
    tmpdir      = /tmp
    lc-messages-dir = /usr/share/mysql
    skip-external-locking
    character-set-server=utf8
    # Instead of skip-networking the default is now to listen only on
    # localhost which is more compatible and is not less secure.
在修改的时候最好用vi修改,我用gedit修改的被提示编码有问题,后来换成vi修改没有错误提示
[参考博客](www.linuxidc.com/Linux/2016-09/135333.htm)
再普及以下vi编辑器的使用
[vim编辑器的使用](http://www.linuxidc.com/Linux/2013-08/89096.htm)
2.重新创建数据库
    1.删除数据库`$ rake db:drop:all`
    此时再`rake db:charset`发现报错了,因为相关的数据库被删除了,会提示:`Unknown database 'helloworld_development'`
    2.创建数据库
        rake db:create
        bundle install
        rake db:charset
    我们会发现返回结果成了utf8

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值