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