7、MySQL中的字符集 - 系統的擼一遍MySQL

什麼是字符集?

計算中的字符文字集合(每一個自負文字分配一個對應的數字),將字符集中的文字符號進行編碼以便於計算機識別處理。sql

字符編碼就是如何在計算機中存儲表示字符集中每一個字符文字對應的數字。數據庫

發展歷程

ASCII與字符集混亂時代

20世紀60年代初,美國標準化組織ANSI發佈了第一個字符集 ASCII 後來演變成了國際標準 ISO-646。服務器

ASCII採用7位編碼,包含大小寫英文字母、阿拉伯數字和標點以及33個控制符號。網絡

以後制定的字符集大部分都兼容ASCII編碼。編碼

隨後各國、個公司紛紛制定本身的字符集標準,好比:GBK、GB2312-80、ISO-8859系列等。到了20世界80年代,你們都崩潰了。。。這麼多字符集很難進行軟件國際化,而後你們就想着能不能統一字符編碼。spa

Unicode

爲了統一這個字符集,1984年ISO的一些成員國開始發起制定新的國際字符集標準,用來容納世界各國的語言文字,而後UCS(ISO-10646)誕生了。code

可是這個UCS遭到了美國不少計算機公司的反對,1988年聯合微軟、蘋果、IBM、SUN等公司成立Unicode 協會,並於1991年推出Unicode1.0。server

而後ISO和Unicode協會爲了統一編碼標準,1991年10月達成協議,ISO將Unicode編碼併入UCS的0組0面中(簡稱爲BMP,UCS編碼劃分爲group、plane、row、cell)。由於是0組0面,因此就不須要存儲了,2個字節進行編碼就足以,因此就理所固然的叫作UCS-2。ci

爲了能使用BMP之外的文字,Unicode提出了UTF-16的解決方案,將BMP外的文字(包含組面共32位),轉爲兩個16位的Unicode編碼。io

可是問題又來了,當時的計算機和網絡智能處理但字節的數據流,爲了讓UTF-16更好的兼容,將BMP內外的文字轉換成了1-4字節的編碼,不一樣數量字節的編碼表示UCS中不一樣範圍的編碼。

中文字符集

GB2312-80 於1980年根據ISO/IEC2022提供的字符編碼,定義爲雙字節字符集。

GB13000 於1993年在GB2312-80基礎上擴充了大量文字,但並無受到業界支持。

GBK 於1995年在GB2312-80基礎上擴充了大量文字,同時兼容GB2312。同時由於獲得微軟支持而流行。

GB18030發佈於2000年,分爲2字節和4字節編碼,2字節部分與GBK保持一致。因此GB18030是GBK的超集。

MySQL中的字符集

查看可用字符集

SHOW CHARACTER SET;

結果能夠分爲字符集和校對規則兩部分。

同一個字符集能夠對應多個校對規則。

校對規則

_ci 結尾的校對規則對大小寫不敏感。

_cs 結尾的校對規則對大小寫敏感

_bin 結尾的校對規則只比較原始編碼,不比較編碼後的值。

字符集設定

MySQL的字符集設定分爲4個級別:服務器、數據庫、表、字段

服務器級別須要在my.cnf中設置 character-set-server 選項 或者在啓動的時候指定。

數據庫級別須要在建立的時候經過charset指定。

表級別和字符級別須要在建立表的時候制定字符集和校對規則。

會話字符集

character_set_client 客戶端字符集和校對規則

character_set_connection 會話鏈接字符集和校對規則

character_set_results 返回結果的字符集和校對規則

一般使用 SET NAMES xxx 的方式對三個同時設定

或者在SQL語句中使用 _字符集名稱來強制使用指定字符集

SELECT _gbk "我是中國人"
相關文章
相關標籤/搜索