MySQL中的utf8、utf8mb4有什么区别
/ / 点击 / 阅读耗时 6 分钟1. 背景
在创建MySQL数据库时,需要指定数据库的字符集。MySQL支持的字符集非常多,在MySQL5.7中,默认字符集是latin1(不常用),在MySQL8.0中,默认字符集是utf8mb4。常用的还有一个utf8。那么这些字符集在MySQL中有什么区别呢?它们的应用场景分别是什么?
2. Unicode
说起字符集,肯定要提起Unicode编码。这是一种全球通用的字符编码。1990年开始研发,1994年正式发布1.0版本,2020年已经更新到13.0版本。
Unicode统一码,也叫万国码、单一码(Unicode),是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
Unicode只是一组字符设定或者说是从数字和字符之间的逻辑映射的概念编码,但是它并没有指定代码点如何在计算机上存储。UCS4、UTF-8、UTF-16(UTF后的数字代表编码的最小单位,如UTF-8表示最小单位1字节(=8 bits),所以它可以使用1、2、3字节等进行编码,UTF-16表示最小单位2字节,所以它可以使用2、4字节进行编码)都是Unicode的编码方案。其中UTF-8因可以兼容ASCII而被广泛使用。
3. MySQL中的utf8和utf8mb4
明白了Unicode的基本设定后,MySQL中的utf8和utf8mb4就好理解了。
MySQL中utf8是utf8mb3的别称,它只支持最长3个字节UTF-8字符,即Unicode中的基本多文平面。在MySQL.5.5.3版本之后,新增了utf8mb4编码,它支持最长4个字节的UTF-8字符。mb的意思是most bytes,即最大字节数。
那为什么要出一个新的utf8mb4呢?
因为不够用了。utf8对于超过3个字节的字符是不能正常保存的,现在常见的emoji表情,和一些生僻汉字,都是占用4个字节。所以在在创建数据库时,编码应选择使用utf8mb4。由于utf8mb4是utf8的超集,所以几乎不用改动,可以从utf8平滑升级。
4. 排序规则
utf8mb4最常用的两个排序规则是utf8mb4_unicode_ci、utf8mb4_general_ci。还有不常用的utf8mb4_bin、utf8mb4_0900_ci等。
4.1 后缀
其中排序规则后缀有着不同的意义:
ci代表case insensitive,意思是大小写不敏感,a与A会在字符判断中当做是一样的。
bin代表二进制,a与A是会区别对待的。
举例说明,在下面的语句中:
1 | SELECT * FROM user WHERE name = 'JACK'; |
在utf8mb4_bin中,是匹配不到jack的。
在utf8mb4_general_ci中,是可以匹配到jack的。
4.2 general和unicode
utf8mb4_unicode_ci,支持Unicode校对规则算法(部分字符),并且支持扩展,速度慢。扩展即把一个字母看作与其他字母组合相等,例如在德语和一些其它语言中『ß』等于『ss』。
utf8mb4_general_ci,不支持扩展,速度快。
对于中英文来说,它们没有很大的区别。