最近在研发过程中,发现前端传递的表情符号无法存入到mysql表中。查询了下,发现mysql需要使用utf8mb4进行编码。
为了搞清楚其中的原因,特意找到了这篇文章。现在将文章主要内容记录下来,有兴趣的还是去看看原文。
核心:如果要支持unicode,那么记得使用utf8mb4,不要用utf8
UTF-8编码
utf-8编码采用可变的1到4个字节来进行字符的编码(U+00000 ~ U+10FFFF)。比如ASCII字符只用一个字节(8bit)来进行表示,而汉字需要2到3个字节来表示。utf-8能够表示1114112个字符(大概一百多万个字符)
MySQL中的utf8字段
Mysql中的utf8只能存储具有1到3个字节的unicode字符,对于需要4个字节编码的unicode字符无法支持。比如将emoji表情(4个字节)存入到utf8字段下,是会失败的。同时原文中提到会有安全问题。
Mysql中的utf8mb4字段
MySQL5.5.3(2010年发布)中引入了一种新的编码utf8mb4。能够完全支持utf8编码,既对于4字节的unicode字符也能完全存储。
修改mysql数据库编码格式
mysql中可以分别指定数据库,表以及表中字段的编码格式。
修改数据库编码格式
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
注:COLLATE表示排序规则,集中常用的排序介绍
- utf8mb4_unicode_ci: 基于标准unicode进行排序,在各种语言之间精确排序;
- utf8mb4_general_ci: 没有实现unicode排序规则,遇到特殊语言或字符集,排序结果可能不一致;性能会更快一些
- utf8mb4_bin:区分大小写。mysql中默认不区分大小写
然而平常开发过程中不要特别关注排序规则,但是要保证编码格式和排序规则要统一。
总结:使用utf8mb4,不要使用utf8
网友评论