1、關於字符集的幾個相關概念
(1)字符Character,人類語言中最小的表意(表達意思的)符號
(2)字符集(合)CharSet 一組字符就可以定義一個字符集合,通常包括一個國家、民族使用的字符
ASCII字符集合、擴展ASCII字符集合、拉丁語系、GB2312 BIG5 Unicode字符集合
(3)字符編碼 給字符集合中的字符指定一個數字來標識
(4)字符集 字符集合+編碼=字符集
(5)字符序 Collation 定義了字符集中字符的排序規則(是否區分 大小寫),有了字符序,就有了排序標準。一個字符集可以 有多個字符序,有的字符序可能區分大小寫,有的字符序可能不區分大小寫。
字符集合 可以有多種編碼方式 多個字符集
一個字符集 可以有多個排序規則 多個字符序
字符序 Collation中的以_ci結尾代表大小寫不敏感,應該是case insensitive,以_cs結尾表示大小寫敏感,以_bin按編碼值進行比較
2、常見的字符集
ASCII字符集
擴展ASCII字符集 latin1 8位二進制,包括ASCII字符集中的全部字符
GB2312 BIG5 GBK 16位二進制
Unicode字符集 全球語言 16位二進制
擴展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
將E5BF8D轉換爲二進制111001011011111110001101
我們知識中文在UTF-8中佔用3個字節,因此它的模板是
1110xxxx 10xxxxxx 10xxxxxx
因此,“忍”字對應的UTF-8碼值爲0101 1111 1100 1101,這16個二進制,恰好是兩個字節
再將這16個二進制數轉換爲16進制數,即5FCD。
再次查看編碼查詢工具,發現BigEndUni的值正好是“5FCD”
同樣的字符,使用的編碼方式不同,佔用的字節數也不相同
(1)Unicode編碼存儲英文。
打開記事本ABCD佔用10個字節,“ABCD”一共4個字符,每個字符采用Unicode編碼佔用2個字節,共8個字節,再加上結束字符(EOF)2個字節,共10個字節。
(2)Unicode編碼存儲中文
記事本中輸入“ABCD你好”,一共6個字符,共佔12字節,再加上結束字符(EOF)2個字節,共14字節。
(3)UTF-8編碼存儲英文
記事本中輸入“ABCD”,共4個字符,每個英文字符佔1個字節,共4個字節,再加上結束字符(EOF)3個字節,共7個字節。
(4)UTF-8編碼存儲中文
記事本中輸入“ABCD你好”,4個英文字符,每個英文字符佔1個字節,共4個字節,2箇中文字符,每個中文字符佔3個字節,共6個字節,再加上結束符(EOF)3個字節,共13個字節。
在控制檯查看可接受的字符集
使用chcp [nnn]
顯示活動控制檯代碼頁數量,或更改該控制檯的活動控制檯代碼頁。如果在沒有參數的情況下使用,則 chcp 顯示活動控制檯代碼頁的數量。 語法 chcp [nnn] 參數 指定代碼頁。下表列出了所有支持的代碼頁及其國家(地區)或者語言: 代碼頁 國家(地區)或語言 437 美國 932 日文(Shift-JIS) 936 中國 - 簡體中文(GB2312) 949 韓文 950 繁體中文(Big5)
說明windows默認的字符集爲 GBK
3、MySQL中的字符集
3.1、查看MySQL支持的所有字符集
show character set;
3.2、MySQL中字符集的使用策略:數據庫級別、表級別、列級別
創建數據庫的時候,如果不指定數據庫的字符集,就會使用服務器的默認字符集
創建表的時候,如果不指定表的字符集,就會使用數據庫字符集
創建列的時候,如果不指定字符集,默認使用表的字符集
3.3、查看當前使用的字符集
show variables like 'character_set_%';
character_set_system 系統級別的字符集
character_set_server 服務器級別使用的字符集
character_set_database 數據庫級別的字符集(每個數據庫可能有自己的字符集)
character_set_system,是server用來存儲identifier(例如:數據庫的名字、表的名字、列的名字)的字符集,總是utf8。
character_set_server,是server的默認字符編碼。【猜想:character_set_system是用來存儲identifier(標識符,例如:數據庫名、表名、列名可以使用中文),而character_set_server是用來指示content(存儲內容)使用的字符編碼】
chracter_set_database,如果當前沒有選中數據庫,則使用character_set_server的值;如果選定了某個數據庫,則會根據該數據庫相應的存儲內容的字符集。
後面的內容,不知道該如何整理了,可能自己還不太清楚吧。。。
character_set_client
character_set_connection
character_set_results
更改MySQL默認字符集
create database schooldb
set names latin1
set names utf8
字符集兼容性