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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章