如果你使用MySQL數(shù)據(jù)庫,請記住一點:你應該總是使用utf8mb4編碼,而不是utf8編碼。
MySQL編碼實現(xiàn)
標準的UTF-8字符編碼可以用4個字節(jié)去編碼最多21位字符,這幾乎包括了世界上所有的字符集了,然而在MySQL里實現(xiàn)的UTF-8編碼使用3個字節(jié)去編碼最多16位字符(即只能存放Unicode編碼從0x0000到0xFFFF的字符)。好在MySQL在2010年實現(xiàn)了一個以utf8mb4命名的UTF-8實現(xiàn),并在5.5.3版本進行了發(fā)布。簡單說utf8mb4是utf8的超集并完全兼容utf8,能夠用4個字節(jié)存儲更多的字符。
Unicode編碼
Unicode并不是真正意義上的編碼技術,它只是將世界上的所有字符定義了一個編號并形成標準;它規(guī)定了字符的二進制代碼,卻沒有規(guī)定這個二進制代碼應該如何存儲。
UTF-8編碼
我們常用的UTF-8、GBK等編碼技術(準確來說應該是字符編碼存儲技術)的核心就是規(guī)定了Unicode的二進制代碼應該如何存儲。比如說我把Unicode的二進制代碼高位補0后存儲起來也是一種編碼方案,只不過這種方案太low了。
UTF-8的編碼規(guī)則很簡單,只有二條:
(1)對于單字節(jié)的符號,字節(jié)的第一位設為0,后面7位為這個符號的Unicode碼。因此對于英文字母,UTF-8編碼和ASCII碼是相同的。
2)對于n字節(jié)的符號(n>1),第一個字節(jié)的前n位都設為1,第n+1位設為0,后面字節(jié)的前兩位一律設為10。剩下的沒有提及的二進制位,全部為這個符號的 Unicode 碼。