目錄 1.MySQL數(shù)據(jù)庫字符集知識1.1.什么是字符集計算機(jī)只能識別0和1這樣的二進(jìn)制數(shù)字,無論是處理計算機(jī)程序,還是進(jìn)行科學(xué)運(yùn)算,最終都要轉(zhuǎn)換為二進(jìn)制數(shù)據(jù)來完成操作;例如,我們輸入一個數(shù)字“8”,計算機(jī)會將其識別成二進(jìn)制數(shù)字“1000”。 但是,計算機(jī)要處理的數(shù)據(jù)不僅僅是數(shù)字,還會有字母,為了處理字母,就產(chǎn)生了ASCII碼系統(tǒng)。英文字母共有26種變化,算上大小寫也才52種變化,即使加上特殊的英文標(biāo)點(diǎn)符號、特殊字符,變化也不多,而用8位二進(jìn)制數(shù)字可以表達(dá)256種字符,也就是說,8位二進(jìn)制數(shù)字就足以勝任英文字符的處理工作了。 但是,各個國家的語言文字大多不同,不僅僅是數(shù)字、字母以及特殊字符。例如中國的漢字?jǐn)?shù)量就有數(shù)萬之多,常用的有幾千個。這時,使用ASCII編碼就會無法滿足需求,于是就有了GBK、BIG5、GB2312這類的字符編碼,采用16位二進(jìn)制數(shù)可以表達(dá)65535個漢字,這對于常用的漢字使用來說就足夠用了。 現(xiàn)在,在簡體中文環(huán)境下,常用的編碼除了GB2312和GB18030之外,還會用到UTF-8。GBK是專門用作中文的字符編碼規(guī)范,UTF是通用轉(zhuǎn)換格式的縮寫,又可稱為萬國碼,理論上來說,UTF可以表達(dá)各種文字的編碼格式。 字符編碼其實(shí)就是將人類使用的英文字母、漢字、特殊符號等信息,通過預(yù)先設(shè)定的轉(zhuǎn)換規(guī)則,將其轉(zhuǎn)換為計算機(jī)可以識別的二進(jìn)制數(shù)字的一種編碼方式。 1.2.MySQL數(shù)據(jù)庫字符集字符集其實(shí)就是一套文字符號及編碼,對應(yīng)的文字及編碼,可以將人類可以識別的內(nèi)容與計算機(jī)可以識別的信息進(jìn)行互相轉(zhuǎn)換。 一個字母表使用了四個字母:A、B、a、b。每個字母賦予一個數(shù)值:A=0,B=1,a=2,b=3。字母A是一個符號,數(shù)字0是A的編碼,這四個字母和它們的編碼組合在一起就可以稱為一個字符集。 MySQL數(shù)據(jù)庫的字符集不僅包括字符集(CHARACTER),還包括校對規(guī)則(COLLATION)。其中,校對規(guī)則的作用是定義比較字符串的方式。 假設(shè)比較兩個字符串的值:A和B。最簡單的方法是查找編碼:A為0,B為1。因?yàn)?小于1,所以可以說A小于B。所做的僅僅是在字符集上應(yīng)用了一個校對規(guī)則。校對規(guī)則是一套規(guī)則,作用是對編碼進(jìn)行比較。 1.3.常用字符集介紹與選擇建議1.3.1.常用字符集介紹在操作系統(tǒng)以及各類軟件中都有字符集,MySQL也不例外。 常用字符集知識:
1.3.2.MySQL如何選擇合適的字符集1、如果存儲的是各種各樣的語言文字,則可以選擇UTF8,這是目前國內(nèi)應(yīng)用最為廣泛的字符集,沒有之一。 2、如果只需要支持中文,并且數(shù)據(jù)量很大,此外,還包含了大量的運(yùn)算,則可以選擇GBK,理論上其可以獲得更高的性能,但不推薦使用。 3、對于新型的互聯(lián)網(wǎng)以及移動互聯(lián)網(wǎng)的混合業(yè)務(wù),推薦使用utf8mb4字符集替代UTF8字符集??傊?,如果沒有極特別的需求,請選擇UTF8或utf8mb4作為數(shù)據(jù)庫的字符集。 4、如果使用開源程序,則可以根據(jù)上述說明進(jìn)行選擇,如果是公司開發(fā)人員自己開發(fā)產(chǎn)品,那么選擇權(quán)就在開發(fā)人員手里,DBA只能提供建議。 1.3.3.查看MySQL數(shù)據(jù)庫字符集和校對規(guī)則查看當(dāng)前MySQL系統(tǒng)支持的字符集 MySQL數(shù)據(jù)庫支持的字符集有很多種,通過命令可以查看當(dāng)前MySQL支持的字符集: show character set; 2.MySQL數(shù)據(jù)庫字符集配置設(shè)置MySQL的字符集需要考慮到很多個層次,將這些需要考慮的層次大概分為7個級別。 1、操作系統(tǒng)級別。 2、操作系統(tǒng)客戶端級別(SSH)。 3、MySQL實(shí)例級別。 4、數(shù)據(jù)庫中的庫級別。 5、表級別(含字段級別)。 6、MySQL客戶端級別(連接及返回結(jié)果)。 7、程序代碼級別。 2.1.Linux系統(tǒng)服務(wù)端字符集設(shè)置很多人在使用MySQL時經(jīng)常會被中文亂碼所困擾,其中Linux系統(tǒng)和連接Linux系統(tǒng)客戶端的字符集設(shè)置可能就是問題之一,對此,要盡量將系統(tǒng)的字符集和系統(tǒng)中軟件的字符集進(jìn)行統(tǒng)一,設(shè)置和生效的方法: vim /etc/sysconfig/il8n #配置到配置文件里可以永久生效。 LANG="zh_CN.UTF-8" #LANG為系統(tǒng)字符集環(huán)境變量,設(shè)置為中文UTF8. SYSFONT="latarcyrheb-sun16" source /etc/sysconfig/il8n #使得修改生效。 echo $LANG #檢查生效情況。 在Linux服務(wù)器里使用MySQL登錄到數(shù)據(jù)庫,要注意系統(tǒng)字符集的使用。 2.2.Linux系統(tǒng)客戶端字符集設(shè)置常見的連接Linux的客戶端為SecureCRT、XShell。 SecureCRT:會話選項-終端-外觀-字符編碼 XShell:地球-下拉箭頭 2.3.MySQL服務(wù)端數(shù)據(jù)庫字符集設(shè)置設(shè)置服務(wù)器的字符集有很多種方法,常用的三種方法: 方法一:在編譯安裝MySQL的時候指定服務(wù)器端字符集。 cmake . -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DWITH_EXTRA_CHARSETS=all 方法二:編譯時沒指定字符集,或者指定了不合適的字符集,也還可以在安裝后修改配置文件。 [mysqld] character-set-server=utf8 方法三:可以在啟動數(shù)據(jù)庫時,增加選項指定的字符集。 mysqld --character-set-server=utf8 2.4.MySQL數(shù)據(jù)庫中的庫的字符集設(shè)置在MySQL中,庫的字符集設(shè)置一般是在建庫的時候指定的,如果在建庫的時候未指定,則庫的字符集與MySQL數(shù)據(jù)庫實(shí)例的字符集一致??赏ㄟ^命令查看當(dāng)前實(shí)例的字符集: show variables like 'character_set_database%'; show variables like 'collation_database%'; 創(chuàng)建數(shù)據(jù)庫test,并查看建庫的字符集: create database test; show create database test\G 在編譯MySQL時,若指定了正確的字符集或者修改配置文件調(diào)整過的服務(wù)器的字符集,那么,在以后建庫的時候就可以直接執(zhí)行簡化的命令“create database test;”。 也可以在建庫的時候指定字符集和校對規(guī)則來建庫; create database oldboy default character set utf8 default collate = utf8_general_ci; "CHARACTER SET UTF8"即為數(shù)據(jù)庫字符集,而“utf8_general_ci”則為校對規(guī)則。 2.5.MySQL數(shù)據(jù)庫表的字符集設(shè)置建表的字符集與庫的字符集應(yīng)一致,設(shè)置表字符集的命令: use test; create table test(id int(4)); show create table test\G; 2.6.MySQL數(shù)據(jù)庫客戶端字符集設(shè)置對MySQL數(shù)據(jù)庫客戶端字符集進(jìn)行設(shè)置,對于防止MySQL更新時,出現(xiàn)中文亂碼有極大的影響,設(shè)置方法也有幾種。 方法一:臨時生效單條命令法。 set names utf8; “set names utf8”也可以用三個命令來替代。 set character_set_client = utf8; set character_set_results = utf8; set character_set_connection = utf8; 方法二:登錄數(shù)據(jù)庫時指定字符集。 mysql --default-character-set=utf8; 方法三:通過修改my.cnf實(shí)現(xiàn)修改MySQL客戶端的字符集,配置方法。 [client] default-character-set=utf8 人工登錄數(shù)據(jù)庫執(zhí)行“set names UTF8”,以及使用MySQL命令指定字符集登錄操作,或者更改my.cnf配置文件客戶端模塊的參數(shù),來實(shí)現(xiàn)更改客戶端字符集,都是改變了MySQL客戶端的client、connection、results3個參數(shù)的字符集。 3.防止數(shù)據(jù)庫的中文顯示亂碼管理員在配置MySQL數(shù)據(jù)庫字符集時,需要盡可能地確保7大項字符集統(tǒng)一,對于管理員來說,查看數(shù)據(jù)庫字符集的基本方法: show variables like 'character_set%'; character_set_client #客戶端字符集 character_set_connection #客戶端連接字符集 character_set_database #數(shù)據(jù)庫字符集,配置文件時指定或建庫建表時指定 character_set_filesystem #文件系統(tǒng)字符集 character_set_results #客戶端返回結(jié)果字符集 character_set_server #服務(wù)器字符集,配置文件時指定或建庫建表時指定 character_set_system #系統(tǒng)字符集 更改Linux系統(tǒng)字符集變量之后,可以查看MySQL中字符集的變化。 徹底防止MySQL數(shù)據(jù)庫內(nèi)的數(shù)據(jù)中文亂碼方法字符集的不一致是數(shù)據(jù)庫亂碼的罪魁禍?zhǔn)?,要想避免MySQL數(shù)據(jù)庫內(nèi)的數(shù)據(jù)中文亂碼方法,就要遵循7大項字符集設(shè)置規(guī)則,即Linux系統(tǒng)服務(wù)端與Linux系統(tǒng)客戶端字符集、MySQL服務(wù)端數(shù)據(jù)庫實(shí)例與MySQL數(shù)據(jù)庫客戶端字符集、MySQL數(shù)據(jù)庫中的庫和表的字符集、程序代碼的字符集要一致。如果是利用文件還原數(shù)據(jù),還要注意文件的編碼問題。 4.更改MySQL數(shù)據(jù)庫庫表的字符集4.1.更改庫的字符集管理員可以使用alter命令對數(shù)據(jù)庫的字符集進(jìn)行更改: show create database oldboy\G alter database oldboy character set latin1 collate = latin1_swedish_ci; show create database oldboy\G alter database oldboy character set utf8 collate utf8_general_ci; show create database oldboy\G 4.2.更改表的字符集管理員也可以使用alter命令對數(shù)據(jù)庫的表的字符集進(jìn)行更改: use test; show create table t1\G alter table t1 character set latin1; show create table t1\G 4.3.生產(chǎn)環(huán)境更改數(shù)據(jù)庫(含數(shù)據(jù))字符集的方法對于已經(jīng)包含了數(shù)據(jù)的庫表,若要對字符集進(jìn)行調(diào)整,就需要將數(shù)據(jù)先導(dǎo)出,然后更改數(shù)據(jù)庫環(huán)境,更改建庫和表的字符集之后,重新導(dǎo)入數(shù)據(jù),這樣才能實(shí)現(xiàn)相應(yīng)的調(diào)整。 1、確保數(shù)據(jù)庫不要更新,然后導(dǎo)出所有數(shù)據(jù)為SQL的文件。 2、針對導(dǎo)出的數(shù)據(jù)進(jìn)行字符集替換(替換表和庫),例如把GBK改為UTF8。 3、修改my.cnf配置文件,更改MySQL客戶端及服務(wù)端的字符集,重啟生效。 4、導(dǎo)入更改過新字符集的庫表的數(shù)據(jù),包括表結(jié)構(gòu)語句,然后提供服務(wù)。 5、將操作系統(tǒng)、SSH客戶端,以及程序更改為對應(yīng)的新字符集。 更改字符集時,要將小的字符集集合更改為大的字符集集合,不然可能會丟失數(shù)據(jù)。 |
|