Mysql字符集和排序規(guī)則詳解
前言
計(jì)算機(jī)存儲(chǔ)數(shù)據(jù)的方式都是二進(jìn)制數(shù)據(jù),但是我們?cè)趍ysql中存儲(chǔ)的是字符串?dāng)?shù)據(jù),那么這些數(shù)據(jù)到底在Mysql中如何存儲(chǔ)呢?這就涉及到字符集的概念。
什么是字符集
舉例如下,假設(shè)存在編碼集test,只能識(shí)別a,b,A,B這幾項(xiàng),同時(shí)編碼規(guī)則如下:
a---->00000001(0x01)
b---->00000010(0x02)
A---->00000011(0x03)
B---->00000100(0x04)
那么字符串'aAB'可以映射為 000000010000001100000100(十六進(jìn)制 0x10304)
而ac將無(wú)法轉(zhuǎn)換,因?yàn)槌隽俗R(shí)別范圍。
上面提到的將字符串根據(jù)字符集映射為二進(jìn)制的過(guò)程稱(chēng)之為編碼,反之就為解碼。
什么是比較規(guī)則
那什么是比較規(guī)則呢?其實(shí)就是字符串的比較規(guī)則,如上舉例而言,可以考慮比較二進(jìn)制編碼的大小,如字符'a'編碼值的十六進(jìn)制為0x01,字符'b'編碼值的十六進(jìn)制為0x02,那么可以確定a<b,這就是二進(jìn)制比較規(guī)則,但是顯然這種規(guī)則適用范圍有限,如果遇到需要忽略大小寫(xiě)的場(chǎng)景,顯然二進(jìn)制編碼比較規(guī)則并不適用,一個(gè)字符集可能對(duì)應(yīng)多種比較規(guī)則。
常用字符集
根據(jù)上面的舉例我們知道了test字符集描述的就是一個(gè)字符范圍的界定,我們常用的字符集還有很多如下所示
ASCII字符集
這是一個(gè)最簡(jiǎn)單的字符集包含128個(gè)字符包含大小寫(xiě)字母,空格,數(shù)字,標(biāo)點(diǎn)符號(hào),特殊字符等,因?yàn)榭偣仓挥?28個(gè)字符,那么可以只采用一個(gè)字節(jié)編碼。
ISO8859-1
在ASCII字符集上擴(kuò)充了128個(gè)西歐常用字符,總共包含256個(gè)字符,這個(gè)字符集又被稱(chēng)為latin1。
GB2312
收錄漢字以及拉丁字母,希臘字母等,這種字符集兼容ASCII字符,在編碼規(guī)則如下:
- 如果是ASCII編碼范圍的字符,采用一個(gè)字節(jié)編碼
- 否則采用兩個(gè)字節(jié)編碼
這種情況編碼長(zhǎng)度不確定的被稱(chēng)為變長(zhǎng)編碼。
GBK字符集
GBK對(duì)GB2312的字符范圍進(jìn)行的擴(kuò)充,兼容GB2312。
Unicode字符集
UniCode收錄了地球上的所有字符,是所有國(guó)家通用的字符集,由此又被稱(chēng)為萬(wàn)國(guó)碼,UniCode的編碼規(guī)則包含UTF8、UTF16、UTF32這幾種編碼方案,其中UTF8采用1~4個(gè)字節(jié)編碼一個(gè)字符,UTF16使用了2個(gè)字節(jié)或者4個(gè)字節(jié)編碼一個(gè)字符,UTF32采用4個(gè)字節(jié)編碼一個(gè)字符。
不過(guò)需要注意的是Mysql中沒(méi)有區(qū)分編碼方案和字符集,所以后續(xù)的uft8可以看作字符集。
注意點(diǎn)
在mysql中有兩個(gè)特殊的字符集:
- utf8mb3:是UniCode字符集編碼方案中utf8的閹割版本,采用的是1~3個(gè)字節(jié)編碼一個(gè)字符,它的另外一個(gè)名字就是utf8也就是說(shuō)mysql中使用的就是閹割版本的utf8字符集。
- **utf8mb4:**采用4個(gè)字節(jié)編碼一個(gè)字符,最常見(jiàn)的就是存儲(chǔ)emoji表情。
Mysql中查詢(xún)字符集和比較規(guī)則
查詢(xún)字符集
查詢(xún)字符集命令可以采用show character set;
或者show charset;
都可以實(shí)現(xiàn)字符集查看,可以支持字符集模糊查詢(xún)?nèi)?code>show character set like '%utf8%';
##### mysql5.7.26版本中,包含41個(gè)字符集,下面列出常用的幾個(gè) 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)
查詢(xún)比較規(guī)則
每個(gè)字符集都會(huì)對(duì)應(yīng)一些比較規(guī)則,查詢(xún)所有字符集的比較規(guī)則顯然是太多了,所以這里以u(píng)tf8字符集為例查詢(xún)比較規(guī)則。
#### mysql5.7.26版本中utf8字符集對(duì)應(yīng)27個(gè)比較規(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ī)律如下:
- 以字符集命名開(kāi)頭,如上面提到utf8。
- 中間一般是指作用于哪種語(yǔ)言,如utf8_spanish_ci,就是以西班牙語(yǔ)的規(guī)則比較。
- 后綴用于區(qū)分比較規(guī)則如是否區(qū)分大小寫(xiě)、重音,二進(jìn)制等
后綴規(guī)則如下:
后綴 | 描述 |
---|---|
_ci | 不區(qū)分大小寫(xiě) |
_cs | 區(qū)分大小寫(xiě) |
_bin | 以二進(jìn)制的形式比較 |
_ai | 不區(qū)分重音 |
_as | 區(qū)分重音 |
到此這篇關(guān)于Mysql字符集和排序規(guī)則詳解的文章就介紹到這了,更多相關(guān)Mysql字符集內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql數(shù)據(jù)庫(kù)的主從復(fù)制與讀寫(xiě)分離精講教程
這篇文章主要為大家詳細(xì)介紹了Mysql數(shù)據(jù)庫(kù)的主從復(fù)制與讀寫(xiě)分離的示例教程,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步2021-11-11MySQL優(yōu)化之大字段longtext、text所生產(chǎn)的問(wèn)題
本文主要介紹了MySQL優(yōu)化之大字段longtext、text所生產(chǎn)的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-05-05詳解mysql8.018在linux上安裝與配置過(guò)程
這篇文章主要介紹了mysql8.018在linux上安裝與配置過(guò)程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01Navicat for SQLite導(dǎo)入csv中文數(shù)據(jù)的方法
這篇文章主要為大家詳細(xì)介紹了Navicat for MySql導(dǎo)入.CSV文件的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-05-05淺談MySQL安裝starting the server失敗的解決辦法
如果電腦是不是第一次安裝MySQL,一般會(huì)出現(xiàn)報(bào)錯(cuò)情況,starting the server失敗,通常是因?yàn)樯洗伟惭b的該軟件未清除干凈,本文就詳細(xì)的介紹一下解決方法,感興趣的可以了解一下2021-09-09MySQL5.7并行復(fù)制原理及實(shí)現(xiàn)
MySQL 5.7并行復(fù)制的思想簡(jiǎn)單易懂,本文就詳細(xì)的介紹了MySQL5.7并行復(fù)制原理及實(shí)現(xiàn),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-06-06在MySQL中創(chuàng)建實(shí)現(xiàn)自增的序列(Sequence)的教程
這篇文章主要介紹了在MySQL中創(chuàng)建實(shí)現(xiàn)自增的序列(Sequence)的教程,分別列舉了兩個(gè)實(shí)例并簡(jiǎn)單討論了一些限制因素,需要的朋友可以參考下2015-12-12mysql_connect(): Connection using old (pre-4.1.1) authentica
MySQL錯(cuò)誤提示:Connection using old (pre-4.1.1) authentication protocol refused (client option ‘secure_auth’ enabled)解決辦法,需要的朋友可以參考下2014-04-04