mysql---字元集詳解

來源:互聯網
上載者:User

常用的字元集包括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 編碼方式


相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.