一篇講明白Utf8和Utf8mb4有什么區別
utf8或者utf-8是大家常見的一個詞匯,它是一種信息的編碼格式,特別是不同開發平臺的系統進行對接的時候,編碼一定要對齊,否則就容易出現亂碼。
什么是編碼?
先說說什么是編碼。編碼就像我們日常生活中的語言,不同的地方說不同的話,編碼就是計算機用來表示這些“話”的一種方式。比如我們使用漢字來說話,計算機用二進制數來表示這些漢字的方式,就是編碼。
utf8就是這樣一種編碼格式,正式點要使用:UTF-8,utf8是一個簡寫形式。
為什么需要utf8?
在計算機早期,主要使用ASCII編碼,只能表示128個字符,漢字完全表示不了。后來,才出現了各種各樣的編碼方式,比如GB2312、GBK、BIG5,但這些編碼只能在特定的環境下使用,不能全球通用。
UTF-8就像一個萬能翻譯官,它的全稱是“Unicode Transformation Format - 8 bit”,注意這里不是說UTF-8只能使用8bit來表示一個字符,實際上UTF-8能表示世界上幾乎所有的字符。
它的特點是:
- 變長編碼:一個字符可以用1到4個字節表示,英文字符用1個字節(8bit),漢字用3個字節(24bit)。
- 向后兼容ASCII:ASCII的字符在UTF-8中還是一個字節,這樣就兼容了老系統。
- 節省空間:對于英文字符,UTF-8比其他多字節編碼更省空間。
UTF-8適用于網頁、文件系統、數據庫等需要全球化支持的場景。
經常接觸代碼的同學應該還經常能看到 Unicode 這個詞,它和編碼也有很大的關系,其實Unicode是一個字符集標準,utf8只是它的一種實現方式。Unicode 作為一種字符集標準,為全球各種語言和符號定義了唯一的數字碼位(code points)。其它的Unicode實現方式還有UTF-16和UTF-32:
- UTF-16 使用固定的16位(2字節)或者變長的32位(4字節,不在常用字符之列)來編碼 Unicode 字符。
- UTF-32 每一個字符都直接使用固定長度的32位(4字節)編碼,不論字符的實際數值大小。這會消耗更多的存儲空間,但是所有字符都可以直接索引訪問。
utf8mb4又是什么?
utf8mb4并不常見,它是UTF-8的一個擴展版本,專門用于MySQL數據庫。MySQL在 5.5.3 之后增加了一個utf8mb4的編碼,mb4就是最多4個字節的意思(most bytes 4),它主要解決了UTF-8不能表示一些特殊字符的問題,比如Emoji表情,這在論壇或者留言板中也經常用到。大家使用小紅書時應該見過各種各樣的表情符號,小紅書后臺也可能使用utf8mb4保存它們。
編碼規則和特點:
- 最多4個字節:utf8mb4中的每個字符最多用4個字節表示。
- 支持更多字符:能表示更多的Unicode字符,包括Emoji和其他特殊符號。
utf8和utf8mb4的比較
存儲空間
- 數據庫:utf8mb4每個字符最多用4個字節,比UTF-8多一個字節,存儲空間會增加。
- 文件:類似的,文件用utf8mb4編碼也會占用更多的空間。
性能影響
- 數據庫:utf8mb4的查詢和索引可能稍微慢一些,因為占用更多的空間和內存。
- 網絡傳輸:utf8mb4編碼的字符會占用更多的帶寬,傳輸速度可能會稍慢。
不過因為實際場景中使用的utf8mb4的字符也不多,其實對存儲空間和性能的影響很小,大家基本沒有必要因為多占用了一些空間和流量,而不是用utf8mb4。
只是我們在定義字段長度、規劃數據存儲空間、網絡帶寬的時候,要充分考慮4字節帶來的影響,預留好足夠的空間。
實戰選擇
在實際開發中,選擇編碼要根據具體需求來定。如果你的網站或者應用需要支持大量的特殊字符和Emoji,使用utf8mb4是個不錯的選擇。如果主要是英文和普通中文文本,utf8足夠應付。
注意為了避免亂碼問題,前端、后端、數據庫都應該使用同一種編碼,比如utf8,具體到編碼時就是要確保數據庫連接、網頁頭部、文件讀寫都設置為相同的編碼。
另外還需要注意Windows和Linux系統中使用UTF-8編碼的文件可能是有差別的,Windows中的UTF-8文件可能會攜帶一個BOM頭,方便系統進行識別,但是Linux中不需要這個頭,所以如果要跨系統使用這個文件,特別是程序腳本,可能需要在Linux中去掉這個頭。