MySQL中utf8與utf8mb4的區別

2021-10-08 14:50:34 字數 1138 閱讀 7558

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 字符集儲存。包括 emoji 表情(emoji)是一種特殊的 unicode 編碼,常見於 ios 和 android 手機上),和很多不常用的漢字,以及任何新增的 unicode 字元等等(utf8的缺點)。

通常,計算機在儲存字元時,會根據不同型別的字元以及編碼方式分配儲存空間。例如以下幾種編碼方式;

ascii編碼中,乙個英文本母(不分大小寫)占用乙個位元組的空間,乙個中文漢字占用兩個位元組的空間。乙個二進位制的數字序列,在計算機中作為乙個數字單元儲存時,一般為8位二進位制數,換算為十進位制。最小值0,最大值255。

utf-8編碼中,乙個英文本元占用乙個位元組的儲存空間,乙個中文(含繁體)占用三個位元組的儲存空間。

unicode編碼中,乙個英文占用兩個位元組的儲存空間,乙個中文(含繁體)占用兩個位元組的儲存空間。

utf-16編碼中,乙個英文本母字元或乙個漢字字元儲存都需要占用2個位元組的儲存空間(unicode擴充套件區的一些漢字儲存需要4個位元組)。

utf-32編碼中,世界上任何字元的儲存都需要占用4個位元組的儲存空間。

既然utf8能相容絕大部分的字元,為什麼要擴充套件utf8mb4?

隨著網際網路的發展,產生了許多新型別的字元,例如emoji這種型別的符號,也就是我們通常在聊天時發的小黃臉表情,這種字元的出現不在基本多平面的unicode字元之中,導致無法在mysql中使用utf8儲存,mysql於是對utf8字元進行了擴充套件,增加了utf8mb4這個編碼。

所以,設計資料庫時如果想要允許使用者使用特殊符號,最好使用utf8mb4編碼來儲存,使得資料庫有更好的相容性,但是這樣設計會導致耗費更多的儲存空間。

網頁utf 8亂碼 utf8亂碼

複製 在前 在windows作業系統上使用ie作為瀏覽器時。常常會發生這樣的問題 在瀏覽使用utf 8編碼的網頁時,瀏覽器無法自動偵測 即沒有設定 自動選擇 編碼格式時 該頁面所用的編碼。即使網頁已經宣告過編碼格式 由此造成某些含有中文utf 8編碼的頁面產生空白輸出。由於utf 8為3個位元組表示...

utf 8與utf 8無BOM的區別

utf 8 8 bit unicode transformation format 是一種針對unicode的可變長度字元編碼,又稱萬國碼。bom byte order mark,位元組序標記 utf 8不需要bom來表明位元組順序,但可以用bom來表明編碼方式。字元 zero width no b...

utf 8與utf 8 無BOM 的區別

bom byte order mark utf 8 bom又叫 utf 8 簽名,其實 utf 8 的bom對uft 8沒有作用,是為了支援utf 16,utf 32才加上的bom,bom簽名的意思就是告訴編輯器當前檔案採用何種編碼,方便編輯器識別,但是bom雖然在編輯器中不顯示,但是會產生輸出,就...