utf8與utf8mb4的區別
最近在寫一個爬蟲的多線程腳本,在異步插入數據庫的時候總有部分數據插入失敗,原因竟然是編碼的問題。捫心自問,mysql最通用的中文字符編碼就是utf-8了,通常情況下,utf-8作為中文編碼是司空見慣的,但是還是一如既往的寫入數據庫失敗。
原來MySQL在5.5.3版本之後增加了這個utf8mb4的編碼,mb4就是most bytes 4的意思,專門用來兼容四字節的unicode。其實,utf8mb4是utf8的超集,理論上原來使用utf8,然後將字符集修改為utf8mb4,也會不會對已有的utf8編碼讀取產生任何問題。當然,為了節省空間,一般情況下使用utf8也就夠了。低版本的MySQL支持的utf8編碼,最大字符長度為 3 字節,如果遇到 4 字節的字符就會出現錯誤了。
UTF-8 最大能編碼的 Unicode 字符是 0xFFFF,也就是 Unicode 中的基本多文平面(BMP)。也就是說,任何不在基本多文平面的 Unicode字符,都無法使用MySQL原有的 utf8 字符集存儲。這些不在BMP中的字符包括哪些呢?最常見的就是Emoji 表情(Emoji 是一種特殊的 Unicode 編碼,常見於 ios 和 android 手機上),和一些不常用的漢字,以及任何新增的 Unicode 字符等等。理論上講, UTF-8 格式使用一至六個字節,最大能編碼 31 位字符。最新的 UTF-8 規範只使用一到四個字節,最大能編碼21位,正好能夠表示所有的 17個 Unicode 平面。為了獲取更好的兼容性,應該總是使用 utf8mb4 而非 utf8,事實上,最新版的phpmyadmin默認字符集就是utf8mb4。誠然,對於 CHAR 類型數據,使用utf8mb4 存儲會多消耗一些空間。
utf8與utf8mb4的區別