MySQL的“utf8”實際上不是真正的UTF-8。“utf8”只支持每個字符最多三個字節,而真正的UTF-8是每個字符最多四個字節。
MySQL一直沒有修復這個bug,他們在2010年發布了一個叫作“utf8mb4”的字符集,繞過了這個問題。
簡單概況:
- MySQL的“utf8mb4”是真正的“UTF-8”。
- MySQL的“utf8”是一種“專屬的編碼”,它能夠編碼的Unicode字符並不多。
所有在使用“utf8”的MySQL和MariaDB用戶都應該改用“utf8mb4”,永遠都不要再使用“utf8”。
什么是編碼?什么是UTF-8?
我們都知道,計算機使用0和1來存儲文本。比如字符“C”被存成“01000011”,那么計算機在顯示這個字符時需要經過兩個步驟:
計算機讀取“01000011”,得到數字67,因為67被編碼成“01000011”。
計算機在Unicode字符集中查找67,找到了“C”。
同樣的:
我的電腦將“C”映射成Unicode字符集中的67。
我的電腦將67編碼成“01000011”,並發送給Web服務器。
幾乎所有的網絡應用都使用了Unicode字符集,因為沒有理由使用其他字符集。
Unicode字符集包含了上百萬個字符。最簡單的編碼是UTF-32,每個字符使用32位。這樣做最簡單,因為一直以來,計算機將32位視為數字,而計算機最在行的就是處理數字。但問題是,這樣太浪費空間了。
UTF-8可以節省空間,在UTF-8中,字符“C”只需要8位,一些不常用的字符,比如“”需要32位。其他的字符可能使用16位或24位。一篇類似本文這樣的文章,如果使用UTF-8編碼,占用的空間只有UTF-32的四分之一左右。
MySQL的“utf8”字符集與其他程序不兼容
總結
如果你在使用MySQL或MariaDB,不要用“utf8”編碼,改用“utf8mb4”。這里(https://mathiasbynens.be/notes/mysql-utf8mb4#utf8-to-utf8mb4)提供了一個指南用於將現有數據庫的字符編碼從“utf8”轉成“utf8mb4”。
英文原文:https://medium.com/@adamhooper/in-mysql-never-use-utf8-use-utf8mb4-11761243e434
原文鏈接:https://blog.csdn.net/cpongo2/article/details/89018239