如果你使用MySQL数据库,请记住一点:你应该总是使用utf8mb4编码,而不是utf8编码。
MySQL编码实现
标准的UTF-8字符编码可以用4个字节去编码最多21位字符,这几乎包括了世界上所有的字符集了,然而在MySQL里实现的UTF-8编码使用3个字节去编码最多16位字符(即只能存放Unicode编码从0x0000到0xFFFF的字符)。好在MySQL在2010年实现了一个以utf8mb4命名的UTF-8实现,并在5.5.3版本进行了发布。简单说utf8mb4是utf8的超集并完全兼容utf8,能够用4个字节存储更多的字符。
Unicode编码
Unicode并不是真正意义上的编码技术,它只是将世界上的所有字符定义了一个编号并形成标准;它规定了字符的二进制代码,却没有规定这个二进制代码应该如何存储。
UTF-8编码
我们常用的UTF-8、GBK等编码技术(准确来说应该是字符编码存储技术)的核心就是规定了Unicode的二进制代码应该如何存储。比如说我把Unicode的二进制代码高位补0后存储起来也是一种编码方案,只不过这种方案太low了。
UTF-8的编码规则很简单,只有二条:
(1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的Unicode码。因此对于英文字母,UTF-8编码和ASCII码是相同的。
2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的 Unicode 码。