一、關於字符集的幾個相關概念sql
(1)字符Character,人類語言中最小的表意(表達意思的)符號數據庫
(2)字符集(合)CharSet 一組字符就能夠定義一個字符集合,一般包括一個國家、民族使用的字符windows
ASCII字符集合、擴展ASCII字符集合、拉丁語系、GB2312 BIG5 Unicode字符集合服務器
(3)字符編碼 給字符集合中的字符指定一個數字來標識ide
(4)字符集 字符集合+編碼=字符集工具
(5)字符序 Collation 定義了字符集中字符的排序規則(是否區分 大小寫),有了字符序,就有了排序標準。一個字符集能夠 有多個字符序,有的字符序可能區分大小寫,有的字符序可能不區分大小寫。編碼
字符集合 能夠有多種編碼方式 多個字符集spa
一個字符集 能夠有多個排序規則 多個字符序3d
字符序 Collation中的以_ci結尾表明大小寫不敏感,應該是case insensitive,以_cs結尾表示大小寫敏感,以_bin按編碼值進行比較code
二、常見的字符集
ASCII字符集
擴展ASCII字符集 latin1 8位二進制,包括ASCII字符集中的所有字符
GB2312 BIG5 GBK 16位二進制
Unicode字符集 全球語言 16位二進制
擴展ASCII字符集,例如:latin一、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
三、MySQL中的字符集
3.一、查看MySQL支持的全部字符集
show character set;
3.二、MySQL中字符集的使用策略:數據庫級別、表級別、列級別
建立數據庫的時候,若是不指定數據庫的字符集,就會使用服務器的默認字符集
建立表的時候,若是不指定表的字符集,就會使用數據庫字符集
建立列的時候,若是不指定字符集,默認使用表的字符集
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
字符集兼容性