MySQL的字符集



1、關於字符集的幾個相關概念

(1)字符Character,人類語言中最小的表意(表達意思的)符號

(2)字符集(合)CharSet 一組字符就可以定義一個字符集合,通常包括一個國家、民族使用的字符

ASCII字符集合、擴展ASCII字符集合、拉丁語系、GB2312 BIG5 Unicode字符集合

(3)字符編碼 給字符集合中的字符指定一個數字來標識

(4)字符集 字符集合+編碼=字符集

(5)字符序 Collation 定義了字符集中字符的排序規則(是否區分 大小寫),有了字符序,就有了排序標準。一個字符集可以 有多個字符序,有的字符序可能區分大小寫,有的字符序可能不區分大小寫。


字符集合 可以有多種編碼方式 多個字符集

一個字符集 可以有多個排序規則 多個字符序


字符序 Collation中的以_ci結尾代表大小寫不敏感,應該是case insensitive,以_cs結尾表示大小寫敏感,以_bin按編碼值進行比較


wKiom1ffS0_iNG-NAAAzTYYJvQg144.png



2、常見的字符集

ASCII字符集

擴展ASCII字符集 latin1 8位二進制,包括ASCII字符集中的全部字符

GB2312 BIG5 GBK 16位二進制

Unicode字符集 全球語言 16位二進制


wKiom1ffTNyg3h-8AAW92GXRcrE665.jpg

擴展ASCII字符集,例如:latin1、latin2

Unicode字符集合 Unicode編碼 一個字符兩個字節

Unicode字符集合 UTF-8編碼 一個英文字符一個字節,一箇中文字符使用3個字節


UTF-8是一種變長字節編碼方式。對於某一字符的UTF-8編碼,如果只有一個字節則其最高二進制爲0;如果是多字節,其第一個字節從高位開始,連續的二進制爲1的個數決定了其編碼的倍數,其餘字節均以10開頭。UTF-8最多可用到6個字節。

如下:

1字節 0xxxxxxx

2字節 110xxxxx 10xxxxxx

3字節 1110xxxx 10xxxxxx 10xxxxxx

4字節 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

5字節 111110xx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx

6字節 1111110x 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx 10xxxxxx


編碼的本質就是用一個數值來表示一個字符

如何獲取一個漢字在UTF-8編碼中碼值呢?

例如一個“忍”字,它對應的UTF-8編碼是E5BF8D

wKiom1ffVUaCYdgrAAAxDW0nos0500.png

將E5BF8D轉換爲二進制111001011011111110001101

wKioL1ffVhrR_RRgAAHR-61qAGE270.gif


我們知識中文在UTF-8中佔用3個字節,因此它的模板是

1110xxxx 10xxxxxx 10xxxxxx

wKioL1ffV1vgK6olAAAR4STq9y4540.png

因此,“忍”字對應的UTF-8碼值爲0101 1111 1100 1101,這16個二進制,恰好是兩個字節

再將這16個二進制數轉換爲16進制數,即5FCD。

wKiom1ffWFLxvpaDAAGURlsrwF0215.gif

再次查看編碼查詢工具,發現BigEndUni的值正好是“5FCD”

wKiom1ffWJzAtvM3AAAw5sL0itY906.png




同樣的字符,使用的編碼方式不同,佔用的字節數也不相同

(1)Unicode編碼存儲英文。

打開記事本ABCD佔用10個字節,“ABCD”一共4個字符,每個字符采用Unicode編碼佔用2個字節,共8個字節,再加上結束字符(EOF)2個字節,共10個字節。

wKioL1ffTnzCjPthAAAeKlsn23A400.png

(2)Unicode編碼存儲中文

記事本中輸入“ABCD你好”,一共6個字符,共佔12字節,再加上結束字符(EOF)2個字節,共14字節。

wKiom1ffT02ySgXbAAAdWnDvDKg903.png


(3)UTF-8編碼存儲英文

記事本中輸入“ABCD”,共4個字符,每個英文字符佔1個字節,共4個字節,再加上結束字符(EOF)3個字節,共7個字節。

wKioL1ffUDCixF4MAAAcXCGmuOk063.png

(4)UTF-8編碼存儲中文

記事本中輸入“ABCD你好”,4個英文字符,每個英文字符佔1個字節,共4個字節,2箇中文字符,每個中文字符佔3個字節,共6個字節,再加上結束符(EOF)3個字節,共13個字節。

wKioL1ffULfzeSuHAAAXCvpizCk274.png



在控制檯查看可接受的字符集

使用chcp [nnn]

wKiom1ffXFfC2mNbAAKwSGZLtW4337.gif

顯示活動控制檯代碼頁數量,或更改該控制檯的活動控制檯代碼頁。如果在沒有參數的情況下使用,則 chcp 顯示活動控制檯代碼頁的數量。 
語法 
chcp [nnn] 
參數 
指定代碼頁。下表列出了所有支持的代碼頁及其國家(地區)或者語言: 
代碼頁       國家(地區)或語言 
437          美國 
932          日文(Shift-JIS)
936          中國 - 簡體中文(GB2312)
949          韓文
950          繁體中文(Big5)


說明windows默認的字符集爲 GBK




3、MySQL中的字符集


3.1、查看MySQL支持的所有字符集

show character set;

wKiom1ffXS-yBeF2AABt4SZkFAU024.png


3.2、MySQL中字符集的使用策略:數據庫級別、表級別、列級別

創建數據庫的時候,如果不指定數據庫的字符集,就會使用服務器的默認字符集

創建表的時候,如果不指定表的字符集,就會使用數據庫字符集

創建列的時候,如果不指定字符集,默認使用表的字符集


3.3、查看當前使用的字符集

show variables like 'character_set_%';

wKioL1ffX9ejg2K4AACeudxZnwE337.png


character_set_system 系統級別的字符集

character_set_server 服務器級別使用的字符集

character_set_database 數據庫級別的字符集(每個數據庫可能有自己的字符集)


character_set_system,是server用來存儲identifier(例如:數據庫的名字、表的名字、列的名字)的字符集,總是utf8。

wKioL1ffY67RWAMEAABHOd75OCE447.png

character_set_server,是server的默認字符編碼。【猜想:character_set_system是用來存儲identifier(標識符,例如:數據庫名、表名、列名可以使用中文),而character_set_server是用來指示content(存儲內容)使用的字符編碼】

wKiom1ffZEqDfHJ6AABLn-eKElc665.png

chracter_set_database,如果當前沒有選中數據庫,則使用character_set_server的值;如果選定了某個數據庫,則會根據該數據庫相應的存儲內容的字符集。

wKiom1ffZieAo4ZFAAB1b3KJ1eI069.png


後面的內容,不知道該如何整理了,可能自己還不太清楚吧。。。

character_set_client

character_set_connection

character_set_results


更改MySQL默認字符集


create database schooldb


set names latin1

set names utf8


字符集兼容性




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章