日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

utf8和utf8mb4的区别

發布時間:2023/12/8 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。