聊一聊MySQL的字符集
一、字符集概述
字符集(Character Set)是多個字元的集合,字符集種類較多,每個字符集包含的字元個數不同,常見字符集名稱:ASCII、GB2312、BIG5、Unicode等。
UTF(Unicode Tranformation Format)是Unicode的其中一個使用方式,即把Unicode轉做某種格式的意思,包括UTF-8,UTF-16,UTF-32。
UTF-8(8-bit Unicode Transformation Format)是一種針對Unicode的可變長度字元編碼,又稱萬國碼。
UTF-8用1到6個位元組編碼Unicode字元。用在網頁上可以同一頁面顯示中文簡體繁體及其它語言(如英文,日文,韓文)。
UTF-16使用一個或兩個未分配的16位程式碼單元的序列對Unicode程式碼點進行編碼。
UTF-32即將每一個Unicode程式碼點表示為相同值的32位整數。
下面是UTF-8的編碼方式:
二、MySQL的字符集
MySQL的字符集包括字符集(charset)和校對規則(collation)兩個概念。
字符集定義了儲存字串的方式,校對規則定義了比較字串的方式。
MySQL8.0支援40多種字符集的270多種校對規則。
可以使用以下指令,來檢視MySQL系統支援的字符集和校對規則。如下:
MySQL8.0之前建立表不指定字符集的話,預設採用latin1字符集,MySQL8.0之後版本才改為預設utf8mb4(most bytes 4)字符集,
崑崙資料庫儲存節點採用的是MySQL8.0架構,當然也是預設utf8mb4。
UTF-8,在MySQL中寫作utf8,真的有所不同。
MySQL從4.1版本開始支援utf8。可能當時的utf8還沒有定義4-6個位元組標準,或者MySQL設計者認為1-3個位元組的utf8已經夠用了。
所以當時MySQL設計的utf8只支援1-3個位元組的編碼,不是完整的utf8,這種編碼方式一直保留至今。
雖然在MySQL在5.5.3之後增加了utf8mb4字符集,但一段時間開發人員都習慣採用utf8等字符集來支援中文。
MySQL的utf8會導致一些4個位元組編碼的生僻漢字插入錯誤。
還有現在APP端的emoji表情是4個位元組的字元,如果不轉碼,直接更新到資料庫也會報出異常。
歷史原因導致MySQL的utf8經常讓人誤解,曾經讓很多開發人員吃了苦頭,網上有些文章比如:“永遠不要在MySQL中使用utf8”,看著都挺嚇人。
當然過個幾年4個位元組的utf8mb4編碼可能又不夠用了,那MySQL又要增加utf8mb5、utf8mb6。
字元除了需要儲存,還需要排序或比較大小,涉及與字符集相對應的校對規則。在MySQL8.0中檢視一下utf8mb4對應的校對規則:
utf8mb4的校對規則預設utf8mb4_0900_ai_ci。其中0900表示Unicode版本9.0.0,字尾含義如下表:
三、舉例來解釋一下MySQL的utf8字符集
建立兩張表,分別為utf8和utf8mb4字符集:
插入資料:
檢視一下表格資料,以及佔用空間:
可以看出utf8字符集中,一般的漢字佔用3個位元組,英文和數字佔1個位元組。
接下來試下4個位元組的emoji表情包:
插入4個位元組的emoji表情包失敗了。
因為大部分SSH工具不支援4位元組的UTF-8字元顯示,筆者是直接在Ubuntu20系統的Terminal做的演示。4位元組的生僻漢字暫時找不到支援的終端介面,這裡就不演示了。
我們在支援4個位元組的utf8mb4表格中插入emoji表情包,並檢視一下資料,以及佔用空間:
最後我們來看看校驗規則,在tb_utf8mb4中插入一些資料:
檢視一下資料,三個記錄都出來了:
這種校對規則,對於網址,郵箱地址等不區分大小寫的場景十分好用,但如果我們需要區分大小寫,可以修改一下校對規則:
再檢視一下資料,這回只有一條記錄滿足:
MySQL的字符集就聊到這裡了,下一篇帶來MySQL的儲存引擎相關內容~
-END-
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70011764/viewspace-2853738/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 聊一聊MySQL的儲存引擎MySql儲存引擎
- 聊一聊MySQL的直方圖MySql直方圖
- 聊一聊MySQL索引失效的問題MySql索引
- 聊一聊 JVM 的 GCJVMGC
- 聊一聊 RestTemplateREST
- 聊一聊 Javascript 中的 ASTJavaScriptAST
- 聊一聊 TLS/SSLTLS
- 聊一聊Javascript中的Promise物件JavaScriptPromise物件
- 簡單聊一聊Vuex的原理Vue
- 聊一聊Java的列舉enumJava
- 聊一聊遊戲的壓測遊戲
- 聊一聊Redis的離線分析Redis
- 聊一聊Jmeter的引數化JMeter
- 聊一聊橋接(JSBridge)的原理橋接JS
- 聊一聊前端換膚前端
- 聊一聊session和cookieSessionCookie
- 聊一聊Greenplum與PostgreSQLSQL
- 聊一聊模板方法模式模式
- 聊一聊測試流程
- 聊一聊Iterable與Iterator的那些事!
- 聊一聊泛型的可空性(kotlin)泛型Kotlin
- 聊一聊Spring Bean 的生命週期SpringBean
- 聊一聊RocketMQ的註冊中心NameServerMQServer
- [gRPC]來聊一聊gRPC的認證RPC
- 聊一聊 SQLSERVER 的行不能跨頁SQLServer
- Nginx-01-聊一聊 nginxNginx
- 聊一聊介面卡模式模式
- 聊一聊隨機數安全隨機
- 聊一聊SQL最佳化SQL
- 聊一聊系統重構
- 聊一聊過度設計!
- 聊一聊責任鏈模式模式
- 聊一聊裝飾者模式模式
- 聊一聊容器暫停退出
- 面試官:我們們來聊一聊mysql主從延遲面試MySql
- 聊一聊黑客是如何思考問題的黑客
- 聊一聊CSS3的漸變——gradientCSSS3
- 聊一聊Vue中的回撥函式Vue函式