常用的字元集包括ASCII ,GB2312 , GBK , UTF-8 ,Unicode
首先要知道
ASCII編碼:
用一個位元組來標識0-9的數字、大小寫字母、及一些標點和不可見字元。1個位元組8位,可以有256種組合。標準的ASCII編碼只利用一個位元組的後7位(128種組合),最高位用作同位。
範圍為0000 0000 - 0111 1111 即 0-127
因為ASCII最多隻有256種組合,中國漢字成千上萬,所以需要更多的位元組來表示一個漢字,常見中文編碼的有GB2312和GBK。
GB2312編碼:
是中國電腦的本地編碼方式,用兩個位元組來表示一個漢字。為了相容ASCII編碼,這兩個位元組的取值範圍都不在0-127,而是在128-255之間。則GB2312理論上最多有128*128=16384種組合。足夠表示常用的漢字。
現有以下幾個數,每個數表示一個位元組,問哪些是GB2312編碼,哪些是用ASCII編碼?數字只是隨便舉的
128 200 65 189 178 23 213 186
128 200 因為兩個位元組都在128-255之間,所以是用GB2312編碼的漢字
65 一個位元組在0-127之間,所以是用ASCII編碼的,實際表示的是小寫字母‘a’。
189 178 同理是用GB2312編碼的漢字
213 186 也是用GB2312編碼的漢字
GBK編碼:
是GB2312的升級版,收容了更多的漢字。它也是用兩個位元組表示漢字,第一個位元組的理論範圍依舊是128-255之間,但第二個位元組範圍變為0-255。理論上最多能表示128*256種組合。同樣能相容ASCII編碼。
比如
128 65 65 189 178 23 213 186
因為128不在0-127之間,所以從128開始的2個位元組表示的是一個漢字
65在0-127,所以用一個位元組表示小寫字母‘a’。
189 178 同理189不在0-127之間,表示的是一個漢字
213 186 同理213 不在0-127之間,表示的是一個漢字
Unicode字元集:
Unicode其實只是相當於一張表,用4個位元組給去全世界的文字進行了編號。
UTF-8編碼:
UTF-8和Unicode的關係,相當於壓縮檔與源檔案的關係,UTF-8用來壓縮Unicode。UTF-8是變長編碼,理論上用1到6位元組來表示一個字元。
最高位是0的,用1個位元組來表示一個字元
最高位有n個連續的1,則用個n個位元組表示一個字元。
MySql亂碼問題:
亂碼問題有兩種可能:1、解碼與對應的編碼不匹配。2、資料損毀。
第一種是可以解決的,第二種資料已損壞無法還原。
對於第一種情況,要先瞭解MySql的各個環節
用戶端先按照用戶端的編碼方式對資料進行編碼,然後傳送到連接器,如果與連接器的編碼方式不匹配再轉換成連接器的編碼。然後比對連接器的編碼與儲存資料的編碼。如果連接器的編碼方式與資料庫儲存資料的編碼方式不一致,則接著轉換成資料庫儲存資料的編碼方式。同理,當返回結果時,資料庫資料比對連接器編碼,不一致則轉成連接器編碼,再比對連接器編碼與結果集編碼,不一致則轉換成結果及編碼。
總而言之,只要用戶端、連接器、結果集編碼保持一致,大部分情況是不會出現亂碼的。
可以通過
set character_set_client = 編碼方式;設定用戶端編碼
set character_set_connection=編碼方式; 設定連接器編碼
set character_set_results=編碼方式; 設定接結果集編碼
這三句話也可以簡化為一句:set names 編碼方式