这是一篇基于编码踩坑博客引发的关于字符编码的讨论整理,你可以先行阅读初始博客
emoji编码
- emoji表情符号,是20世纪90年代由NTT Docomo栗田穣崇(Shigetaka Kurit)创建的,词义来自日语(えもじ,e-moji,moji在日语中的含义是字符)。emoji可以使数字通信做到让人如同面对面交流,避免错误传达信息。
- 在NTT DoCoMo的i-mode系统电话系统中,绘文字的尺寸是12x12 像素,在传送时,一个图形有2个字节。
- 自苹果公司发布的iOS 5输入法中加入了emoji后,这种表情符号开始席卷全球,目前emoji已被大多数现代计算机系统所兼容的Unicode编码采纳,普遍应用于各种手机短信和社交网络中。
- 所谓Emoji就是一种在Unicode位于\u1F601-\u1F64F区段的字符。这个显然超过了目前常用的UTF-8字符集的编码范围\u0000-\uFFFF。
UTF-8编码
UTF8MB4
- utf8mb4是utf8的超集并完全兼容utf8,能够用四个字节存储更多的字符,mb4就是most bytes 4的缩写,即至多四字节的意思
问题
为什么emoji的编码范围U+1F601 ~ U+1F64F被覆盖在UTF-8规范限制后的范围U+0000 ~ U+10FFFF,但是UTF-8不兼容emoji,需要使用UTF8MB4
或者说,为什么我们日常说的(MySQL < 8.0 默认的)UTF-8指的是UTF8MB3(范围U+0000 ~ U+FFFF),但是实际上UTF-8并非仅有这个范围
解决
查了一下,utf8mb x这个是mysql特有的一个概念,这个问题也只会出现在旧版本的mysql里
官方文档reference
- https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8mb4.html
- https://dev.mysql.com/doc/refman/8.0/en/charset-unicode-utf8mb3.html