阿里巴巴Java开发手册(嵩山版)中有如下规则:
12. 【参考】因国际化需要,所有的字符存储与表示,均采用 utf 8 字符集,那么字符计数方法需
要注意。
说明:
SELECT LENGTH("轻松工作"); 返回为 12
SELECT CHARACTER_LENGTH("轻松工作"); 返回为 4
如果需要存储表情,那么选择 utf8mb4 来进行存储,注意它与 utf8 编码的区别。
区别如下:
utf8mb4和utf8的主要区别在于它们对Unicode字符的支持范围和存储空间的需求:
编码范围:
- utf8(也常被称为utf8三字节UTF-8)在MySQL中原本设计为支持Basic Multilingual Plane (BMP)内的字符,这意味着它最多只能处理使用1到3个字节编码的Unicode字符。这涵盖了大部分常用的拉丁字母、西里尔字母、希腊字母、阿拉伯字母、汉字等。但是,它不支持BMP之外的字符,比如一些表情符号(Emojis)、某些罕用汉字、以及增补平面中的其他Unicode字符。
- utf8mb4是utf8的扩展,能够支持存储任何Unicode字符,包括使用4个字节编码的字符,如表情符号、额外的罕用汉字以及增补平面中的其他字符。这使得utf8mb4成为存储包括表情符号在内的全系列Unicode字符的更好选择。
存储空间:
- 使用utf8字符集时,每个字符最多使用3个字节存储。例如,一个VARCHAR(10)字段在utf8下,如果存储全英文字符,每个字符需要1个字节,而存储中文字符则每个字符需要3个字节。
- 使用utf8mb4字符集时,每个字符最多使用4个字节存储。这意味着相同的VARCHAR(10)字段,在存储字符时会占用更多的空间。对于全英文字符,utf8mb4仍然只需要1个字节,但对于需要4字节编码的字符(如某些表情符号),则每个字符需要4个字节。
性能与兼容性:
- 由于utf8mb4需要更多的存储空间,相比utf8,在存储和检索数据时可能会有轻微的性能损失,特别是在处理大量文本数据时。
- 大多数现代应用程序和数据库系统都支持utf8mb4,但旧系统或有限制的系统可能仅支持utf8。
总结来说,如果你的应用需要支持和存储包括表情符号在内的所有Unicode字符,utf8mb4是更合适的选择。虽然它可能占用更多的存储空间,但它提供了更全面的字符支持。而对于不需要存储四字节字符的应用,使用utf8可以节省空间。