<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
在MySQL中,我經常會看見utf8和utf8mb4這兩種編碼格式,但是這兩種格式我並不瞭解,一般建立資料庫的時候,如果讓我選,我預設會選擇utf8,但是這個和UTF-8長得最像。
但是實際上,這兩種是有區別的。
所以,如果想要在程式中儲存emoji表情的話,是需要使用utf8mb4字元集的,因為emoji表情是需要使用4位元組編碼一個字元。
在MySQL8.0中,已經極大程度優化了utf8mb4字元集的效能,並將其設定為預設字元集
比較規則是指對於某種字元集來說,制定用來比較字元大小的多種規則,一種字元集多種規則,一個預設規則。
在MySQL中,可以通過以下命令檢視比較規則
show collation [like 匹配的模式];
這些命名是有規律的。
字尾 | 描述 |
---|---|
_ai | 不區分重音 |
_as | 區分重音 |
_ci | 不區分大小寫 |
_cs | 區分大小寫 |
_bin | 以二進位制方式進行比較 |
在MySQL中有四個級別的字元集和比較規則。
MySQL提供了兩種系統變數表示伺服器級別的字元集和比較規則
系統變數 | 描述 |
---|---|
character_set_server | 伺服器級別的字元集 |
collation_server | 伺服器級別的比較規則 |
可以通過SET語句來改變這兩個系統變數。
也可以通過修改組態檔來修改
在建立和修改資料庫時候可以指定資料庫的字元集和比較規則
如果想要檢視當前資料庫的字元集和比較規則,可以檢視下面兩個系統變數的值
系統變數 | 描述 |
---|---|
character_set_database | 當前資料庫的字元集 |
collation_database | 當前資料庫的比較規則 |
需要注意的是,這兩個系統變數並不同與描述伺服器級別的字元集和比較規則的那兩個比較規則,這兩個系統變數只是用來告訴使用者當前資料庫的字元集和比較規則是什麼,並不能通過修改兩個變數的值來修改檔期按資料庫的字元集和比較規則。
如果在建立資料庫的時候不指定字元集和比較規則,那麼將會使用伺服器級別的字元集和比較規則來作為資料庫的字元集和比較規則。
可以在建立和修改表的時候指定表的字元集和比較規則
如果建立表的語句沒有指定字元集和比較規則,則會使用該表所在資料庫的字元集和比較規則作為該表的字元集和比較規則。
可以在建立和修改列的時候指定該列的字元集和比較規則
對於某一列來說,如果建立和修改表的語句沒有指定字元集和比較規則,則會使用該列所在的表的字元集和比較規則作為其字元集和比較規則。
注意:如果在修改列的字元集的時候,如果儲存的資料不能使用修改後的字元集進行表示,則會報錯
字元集和比較規則之間是相互聯絡的,只修改其一需要遵循以下規則:
在使用者端傳送請求的時候,一般來說,使用者端編碼請求字串時使用的字元集與作業系統當前使用的字元集一致。
但是如果MySQL使用者端設定了default-character-set啟動選項的時候,那麼伺服器就會忽視作業系統當前使用的字元集。
而在伺服器接收請求的時候,伺服器接收到的請求實際上就是一個位元組序列。伺服器會將這個位元組序列看作是使用系統變數character_set_client表示的字元集編碼的位元組序列。
注意的是,這個系統變數character_set_client是session級別的
使用者端傳送請求的字元集和伺服器接收請求的字元集是兩個獨立的字元集,一般來說,使用者端傳送請求所用字元集應和伺服器接收請求的字元集應保持一致,但是也會出現不一致的時候
如果伺服器的character_set_client對應的字元集不能解釋請求的位元組序列,那麼伺服器就會發出警告。
在伺服器處理請求的時候,會將伺服器接收請求的character_set_client對應的字元集進行編碼的位元組序列轉換成session級別的系統變數character_set_connection對應的字元集進行編碼的位元組序列。
對於character_set_connection我們可以通過SET命令單獨修改此係統變數,除了character_set_connection,還有一個與其對應的系統變數collation_connection,這個系統變數表示了這些字串應使用哪種比較規則。
同樣這個系統變數collation_connection可以通過SET命令進行修改。
如果使用者端傳送請求、伺服器接收請求和伺服器處理請求這一過程中,字元集和比較規則不一樣,會出現什麼情況呢?
就這個表來說
向用戶端傳送一條查詢語句
由於當前作業系統使用的是gbk字元集,所以字串‘我’是使用GBK字元集進行編碼的,比較規則為gbk_chinese_ci,而列C使用的是utf8字元集編碼的,比較規則為utf8_general_ci。
那麼在這種情況下,列的字元集和排序規則的優先順序更高,也就是說這裡需要將‘我’從GBK字元集轉換成utf8字元集,然後使用列c的比較規則進行比較。
當伺服器生成響應的時候,是不是直接將列c也就是utf8字元集進行編碼的結果傳送回使用者端呢?
答案是不一定,這取決與SESSION級別的系統變數character_set_results的值,結果會從utf8字元集編碼的轉換成
character_set_results對應的字元編碼後的位元組序列
系統變數 | 描述 |
---|---|
character_set_client | 伺服器認為請求是按照系統變數指定的字元集進行編碼的 |
character_set_connection | 伺服器在處理請求時,會將請求字元序列從character_set_client轉換成character_set_connection |
character_set_results | 伺服器採用該系統變數指定的字元集對返回使用者端的字串進行編碼 |
由於三個變數均為SESSION級別,因此每個使用者端與伺服器建立連線的時候都會維護這三個變數。
最後就是使用者端接收響應了,響應也就是一個位元組序列,收到的位元組序列會直接寫進黑框框中,再由黑框框將位元組序列接受成人類能懂的字元(如果沒有特殊設定,一般使用作業系統當前使用的字元集進行解釋)
參考:《MySQL是怎樣執行的:從根兒上理解 MySQL》
到此這篇關於MySQ字元集和比較規則的文章就介紹到這了,更多相關MySQ字元集和比較規則內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45