遇到了關於字符集的問題
遇到了字符集編碼不一致問題,導致數據庫不支持中文,原因是這樣的
首先,我們安裝的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