一篇講明白Utf8和Utf8mb4有什么區(qū)別
utf8或者utf-8是大家常見的一個詞匯,它是一種信息的編碼格式,特別是不同開發(fā)平臺的系統(tǒng)進行對接的時候,編碼一定要對齊,否則就容易出現(xiàn)亂碼。
什么是編碼?
先說說什么是編碼。編碼就像我們?nèi)粘I钪械恼Z言,不同的地方說不同的話,編碼就是計算機用來表示這些“話”的一種方式。比如我們使用漢字來說話,計算機用二進制數(shù)來表示這些漢字的方式,就是編碼。
utf8就是這樣一種編碼格式,正式點要使用:UTF-8,utf8是一個簡寫形式。
為什么需要utf8?
在計算機早期,主要使用ASCII編碼,只能表示128個字符,漢字完全表示不了。后來,才出現(xiàn)了各種各樣的編碼方式,比如GB2312、GBK、BIG5,但這些編碼只能在特定的環(huán)境下使用,不能全球通用。
UTF-8就像一個萬能翻譯官,它的全稱是“Unicode Transformation Format - 8 bit”,注意這里不是說UTF-8只能使用8bit來表示一個字符,實際上UTF-8能表示世界上幾乎所有的字符。
它的特點是:
- 變長編碼:一個字符可以用1到4個字節(jié)表示,英文字符用1個字節(jié)(8bit),漢字用3個字節(jié)(24bit)。
 - 向后兼容ASCII:ASCII的字符在UTF-8中還是一個字節(jié),這樣就兼容了老系統(tǒng)。
 - 節(jié)省空間:對于英文字符,UTF-8比其他多字節(jié)編碼更省空間。
 
UTF-8適用于網(wǎng)頁、文件系統(tǒng)、數(shù)據(jù)庫等需要全球化支持的場景。
經(jīng)常接觸代碼的同學應該還經(jīng)常能看到 Unicode 這個詞,它和編碼也有很大的關系,其實Unicode是一個字符集標準,utf8只是它的一種實現(xiàn)方式。Unicode 作為一種字符集標準,為全球各種語言和符號定義了唯一的數(shù)字碼位(code points)。其它的Unicode實現(xiàn)方式還有UTF-16和UTF-32:
- UTF-16 使用固定的16位(2字節(jié))或者變長的32位(4字節(jié),不在常用字符之列)來編碼 Unicode 字符。
 - UTF-32 每一個字符都直接使用固定長度的32位(4字節(jié))編碼,不論字符的實際數(shù)值大小。這會消耗更多的存儲空間,但是所有字符都可以直接索引訪問。
 

utf8mb4又是什么?
utf8mb4并不常見,它是UTF-8的一個擴展版本,專門用于MySQL數(shù)據(jù)庫。MySQL在 5.5.3 之后增加了一個utf8mb4的編碼,mb4就是最多4個字節(jié)的意思(most bytes 4),它主要解決了UTF-8不能表示一些特殊字符的問題,比如Emoji表情,這在論壇或者留言板中也經(jīng)常用到。大家使用小紅書時應該見過各種各樣的表情符號,小紅書后臺也可能使用utf8mb4保存它們。
編碼規(guī)則和特點:
- 最多4個字節(jié):utf8mb4中的每個字符最多用4個字節(jié)表示。
 - 支持更多字符:能表示更多的Unicode字符,包括Emoji和其他特殊符號。
 
utf8和utf8mb4的比較
存儲空間
- 數(shù)據(jù)庫:utf8mb4每個字符最多用4個字節(jié),比UTF-8多一個字節(jié),存儲空間會增加。
 - 文件:類似的,文件用utf8mb4編碼也會占用更多的空間。
 
性能影響
- 數(shù)據(jù)庫:utf8mb4的查詢和索引可能稍微慢一些,因為占用更多的空間和內(nèi)存。
 - 網(wǎng)絡傳輸:utf8mb4編碼的字符會占用更多的帶寬,傳輸速度可能會稍慢。
 
不過因為實際場景中使用的utf8mb4的字符也不多,其實對存儲空間和性能的影響很小,大家基本沒有必要因為多占用了一些空間和流量,而不是用utf8mb4。
只是我們在定義字段長度、規(guī)劃數(shù)據(jù)存儲空間、網(wǎng)絡帶寬的時候,要充分考慮4字節(jié)帶來的影響,預留好足夠的空間。
實戰(zhàn)選擇
在實際開發(fā)中,選擇編碼要根據(jù)具體需求來定。如果你的網(wǎng)站或者應用需要支持大量的特殊字符和Emoji,使用utf8mb4是個不錯的選擇。如果主要是英文和普通中文文本,utf8足夠應付。
注意為了避免亂碼問題,前端、后端、數(shù)據(jù)庫都應該使用同一種編碼,比如utf8,具體到編碼時就是要確保數(shù)據(jù)庫連接、網(wǎng)頁頭部、文件讀寫都設置為相同的編碼。
另外還需要注意Windows和Linux系統(tǒng)中使用UTF-8編碼的文件可能是有差別的,Windows中的UTF-8文件可能會攜帶一個BOM頭,方便系統(tǒng)進行識別,但是Linux中不需要這個頭,所以如果要跨系統(tǒng)使用這個文件,特別是程序腳本,可能需要在Linux中去掉這個頭。















 
 
 











 
 
 
 