utf8和utf8mb4的区别
1. 基礎知識
1.1?bit ,?byte ,?word
字? ? ?word?
字節? byte (B)
位? ? ?bit (b)
1.2 單位換算
1字節 = 8位(1 byte = 8bit)
1字 = 2字節(1 word = 2 byte)
一個漢字 = 2字節?
中文標點 = 三個字節
一個英文字母 = 一個字節
英文標點 = 一個字節
Emoji表情或者某些特殊字符 = 4個字節
1.3 Ascll
因為計算機只能處理數字,如果要處理文本,就必須先把文本轉換為數字才能處理。
最早的計算機在設計時采用8個比特(bit)作為一個字節(byte)。
一個字節能表示的最大的整數就是255(2^8-1=255),而ASCII編碼,占用0 - 127用來表示大小寫英文字母、數字和一些符號,這個編碼表被稱為Ascll表,比如大寫字母A的編碼是65,小寫字母z的編碼是122。
1.4?Unicode?
如果要表示中文,顯然一個字節是不夠的,至少需要兩個字節,而且還不能和ASCII編碼沖突,所以,中國制定了GB2312編碼,用來把中文編進去。
類似的,日文和韓文等其他語言也有這個問題。為了統一所有文字的編碼,Unicode應運而生。Unicode把所有語言都統一到一套編碼里,這樣就不會再有亂碼問題了。
Unicode通常用兩個字節表示一個字符,原有的英文編碼從單字節變成雙字節,只需要把高字節全部填為0就可以。
2. utf8 &?utf8mb4
2.1?utf8
是針對Unicode的一種可變長度字符編碼。
由于對可以用Ascll表示的字符,使用Unicode并不高效,因為Unicode比Ascll占用大一倍的空間,而對ASCII來說高字節的0對他毫無用處。
為了解決這個問題,就出現了一些中間格式的字符集,他們被稱為通用轉換格式,即UTF(Unicode Transformation Format)。
2.2?utf8mb4(mb4 = most bytes 4)
所以utf8是utf8mb4的子集,除了將編碼改為utf8mb4外不需要做其他轉換。
MySQL在5.5.3之后增加了這個utf8mb4的編碼,mb4就是most bytes 4的意思,專門用來兼容四字節的unicode。好在utf8mb4是utf8的超集,除了將編碼改為utf8mb4外不需要做其他轉換。當然,為了節省空間,一般情況下使用utf8也就夠了。
?既然utf8應付日常使用完全沒有問題,那為什么還要使用utf8mb4呢?
低版本的MySQL支持的utf8編碼,最大字符長度為 3 字節,如果遇到 4 字節的字符就會出現錯誤了。
三個字節的 UTF-8 最大能編碼的 Unicode 字符是 0xFFFF,也就是 Unicode 中的基本多文平面(BMP)。
也就是說,任何不在基本多文平面的 Unicode字符,都無法使用MySQL原有的 utf8 字符集存儲。
?可以到以下的鏈接,看unicode編碼區從1 ~ 126就屬于傳統utf8區,當然utf8mb4也兼容這個區,126行以下就是utf8mb4擴充區,什么時候你需要存儲那些字符,你才用utf8mb4,否則只是浪費空間。 ?
編碼http://blog.csdn.net/leelyliu/article/details/52879685
2.3?utf8mb4比utf8多了emoji編碼支持
如果實際用途上來看,可以給要用到emoji的庫或者說表,設置utf8mb4.
比如評論要支持emoji可以用到.
建議普通表使用utf8 如果這個表需要支持emoji就使用utf8mb4
2.4?排序規則
排序規則選擇常用的有utf8_general_ci , utf8_unicode_ci
utf8_unicode_ci ? 是基于標準的Unicode來排序和比較,能夠在各種語言之間精確排序 , 為了能夠處理特殊字符的情況,實現了略微復雜的排序算法。
所以 ?utf8_unicode_ci ? 的準確性比較好 , 但是性能相對比較低。
utf8_general_ci ?沒有實現Unicode排序規則,在遇到某些特殊語言或字符是,排序結果可能不是所期望的。
比如Unicode把?、?當成ss和OE來看;而general會把它們當成s、e,再如àá??ā?各自都與 A 相等。在比較和排序的時候更快 ,所以utf8_general_ci ?的準確性較低 , 但是性能比較好。通常情況下 utf8_general_ci的準確性就夠我們用的了。
索引長度,從utf8轉utf8mb4,容易引起索引鍵超長錯誤,InnoDB有單個索引最大字節數 768 的限制,而字段定義的是能存儲的字符數,比如 VARCHAR(200) 代表能夠存200個漢字,索引定義是字符集類型最大長度算的,超過768后拋出異常。
2.5?推薦新項目中使用utf8mb4的編碼
UTF-8 編碼是一種變長的編碼機制,可以用1~4個字節存儲字符。
因為歷史遺留問題,MySQL 中的 utf8 編碼并不是真正的 UTF-8,而是閹割版的,最長只有3個字節。
當遇到占4個字節的 UTF-8 編碼,例如 emoji 字符或者復雜的漢字,會導致存儲異常。
從 5.5.3 開始,MySQL 開始用 utf8mb4 編碼來實現完整的 UTF-8,其中 mb4 表示 most bytes 4,最多占用4個字節。
從 8.0 之后,將會在某個版本開始用 utf8mb4 作為默認字符編碼。
創建數據庫時,如果沒有指定字符集,會采用服務器的默認字符集。設置服務器默認字符集為 utf8mb4 可以提高便利性。
?
總結
以上是生活随笔為你收集整理的utf8和utf8mb4的区别的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: iOS系统特点
- 下一篇: jfinal save 超过9个字段以上