Mysql字符集和排序規(guī)則詳解
前言
計算機存儲數(shù)據(jù)的方式都是二進制數(shù)據(jù),但是我們在mysql中存儲的是字符串?dāng)?shù)據(jù),那么這些數(shù)據(jù)到底在Mysql中如何存儲呢?這就涉及到字符集的概念。
什么是字符集
舉例如下,假設(shè)存在編碼集test,只能識別a,b,A,B這幾項,同時編碼規(guī)則如下:
a---->00000001(0x01)
b---->00000010(0x02)
A---->00000011(0x03)
B---->00000100(0x04)
那么字符串'aAB'可以映射為 000000010000001100000100(十六進制 0x10304)
而ac將無法轉(zhuǎn)換,因為超出了識別范圍。
上面提到的將字符串根據(jù)字符集映射為二進制的過程稱之為編碼,反之就為解碼。
什么是比較規(guī)則
那什么是比較規(guī)則呢?其實就是字符串的比較規(guī)則,如上舉例而言,可以考慮比較二進制編碼的大小,如字符'a'編碼值的十六進制為0x01,字符'b'編碼值的十六進制為0x02,那么可以確定a<b,這就是二進制比較規(guī)則,但是顯然這種規(guī)則適用范圍有限,如果遇到需要忽略大小寫的場景,顯然二進制編碼比較規(guī)則并不適用,一個字符集可能對應(yīng)多種比較規(guī)則。
常用字符集
根據(jù)上面的舉例我們知道了test字符集描述的就是一個字符范圍的界定,我們常用的字符集還有很多如下所示
ASCII字符集
這是一個最簡單的字符集包含128個字符包含大小寫字母,空格,數(shù)字,標(biāo)點符號,特殊字符等,因為總共只有128個字符,那么可以只采用一個字節(jié)編碼。
ISO8859-1
在ASCII字符集上擴充了128個西歐常用字符,總共包含256個字符,這個字符集又被稱為latin1。
GB2312
收錄漢字以及拉丁字母,希臘字母等,這種字符集兼容ASCII字符,在編碼規(guī)則如下:
- 如果是ASCII編碼范圍的字符,采用一個字節(jié)編碼
- 否則采用兩個字節(jié)編碼
這種情況編碼長度不確定的被稱為變長編碼。
GBK字符集
GBK對GB2312的字符范圍進行的擴充,兼容GB2312。
Unicode字符集
UniCode收錄了地球上的所有字符,是所有國家通用的字符集,由此又被稱為萬國碼,UniCode的編碼規(guī)則包含UTF8、UTF16、UTF32這幾種編碼方案,其中UTF8采用1~4個字節(jié)編碼一個字符,UTF16使用了2個字節(jié)或者4個字節(jié)編碼一個字符,UTF32采用4個字節(jié)編碼一個字符。
不過需要注意的是Mysql中沒有區(qū)分編碼方案和字符集,所以后續(xù)的uft8可以看作字符集。
注意點
在mysql中有兩個特殊的字符集:
- utf8mb3:是UniCode字符集編碼方案中utf8的閹割版本,采用的是1~3個字節(jié)編碼一個字符,它的另外一個名字就是utf8也就是說mysql中使用的就是閹割版本的utf8字符集。
- **utf8mb4:**采用4個字節(jié)編碼一個字符,最常見的就是存儲emoji表情。
Mysql中查詢字符集和比較規(guī)則
查詢字符集
查詢字符集命令可以采用show character set;
或者show charset;
都可以實現(xiàn)字符集查看,可以支持字符集模糊查詢?nèi)?code>show character set like '%utf8%';
##### mysql5.7.26版本中,包含41個字符集,下面列出常用的幾個 mysql> show character set; +----------+---------------------------------+---------------------+--------+ | Charset | Description | Default collation | Maxlen | +----------+---------------------------------+---------------------+--------+ | latin1 | cp1252 West European | latin1_swedish_ci | 1 | | ascii | US ASCII | ascii_general_ci | 1 | | gb2312 | GB2312 Simplified Chinese | gb2312_chinese_ci | 2 | | gbk | GBK Simplified Chinese | gbk_chinese_ci | 2 | | utf8 | UTF-8 Unicode | utf8_general_ci | 3 | | utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 | ........ +----------+---------------------------------+---------------------+--------+ 41 rows in set (0.00 sec)
查詢比較規(guī)則
每個字符集都會對應(yīng)一些比較規(guī)則,查詢所有字符集的比較規(guī)則顯然是太多了,所以這里以utf8字符集為例查詢比較規(guī)則。
#### mysql5.7.26版本中utf8字符集對應(yīng)27個比較規(guī)則,其余省略 mysql> show collation like '%utf8\_%'; +--------------------------+---------+-----+---------+----------+---------+ | Collation | Charset | Id | Default | Compiled | Sortlen | +--------------------------+---------+-----+---------+----------+---------+ | utf8_general_ci | utf8 | 33 | Yes | Yes | 1 | | utf8_bin | utf8 | 83 | | Yes | 1 | | utf8_unicode_ci | utf8 | 192 | | Yes | 8 | | utf8_spanish_ci | utf8 | 199 | | Yes | 8 | ......... +--------------------------+---------+-----+---------+----------+---------+ 27 rows in set (0.00 sec)
Default列為YES表明該比較規(guī)則是默認(rèn)的,一般比較規(guī)則中包含general代表通用比較規(guī)則。
比較規(guī)則一般命名如規(guī)律如下:
- 以字符集命名開頭,如上面提到utf8。
- 中間一般是指作用于哪種語言,如utf8_spanish_ci,就是以西班牙語的規(guī)則比較。
- 后綴用于區(qū)分比較規(guī)則如是否區(qū)分大小寫、重音,二進制等
后綴規(guī)則如下:
后綴 | 描述 |
---|---|
_ci | 不區(qū)分大小寫 |
_cs | 區(qū)分大小寫 |
_bin | 以二進制的形式比較 |
_ai | 不區(qū)分重音 |
_as | 區(qū)分重音 |
到此這篇關(guān)于Mysql字符集和排序規(guī)則詳解的文章就介紹到這了,更多相關(guān)Mysql字符集內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql中DATE_FORMAT()函數(shù)的具體使用
在MySQL中,DATE_FORMAT()函數(shù)用于將日期/時間類型的值按照指定的格式進行格式化輸出,具有一定的參考價值,感興趣的可以了解一下2024-05-05Linux下二進制方式安裝mysql5.7版本和系統(tǒng)優(yōu)化的步驟
這篇文章主要介紹了Linux下二進制方式安裝mysql5.7版本和系統(tǒng)優(yōu)化的步驟,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-01-01MySQL?數(shù)據(jù)庫的對庫的操作及其數(shù)據(jù)類型
這篇文章主要介紹了MySQL?數(shù)據(jù)庫的對庫的操作及其數(shù)據(jù)類型,下面文字圍繞數(shù)據(jù)庫的對庫的操作及其數(shù)據(jù)類型的相關(guān)資料展開詳細介紹,需要的小伙伴可以參考一下,希望對你有所幫助2021-12-12