mysql 中 utf8、utf16、utf32、utf8mb3、utf8mb4的区别

UTF-8 - “ 大小优化 ”:最适合基于拉丁字符的数据(或ASCII),每个字符只需1个字节,但大小相应增加符号种类(在最坏的情况下,每个字符最多可增加6个字节)
UTF-16 - “ 平衡 ”:每个字符至少需要2个字节,足以支持现有的主流语言集,并且具有固定的大小以便于字符处理(但是大小仍然可变,每个字符最多可以增加4个字节)
UTF-32 - “ 性能 ”:允许使用简单算法作为固定大小字符(4字节)的结果但存在内存缺点

 

UTF-8
没有字节顺序的概念
每个字符使用1到4个字节
ASCII是兼容的编码子集
完全自同步,例如来自流中任何地方的丢弃字节最多会损坏一个字符
几乎所有欧洲语言都以每个字符两个字节或更少的字节编码
UTF-16
必须使用已知的字节顺序进行解析或读取字节顺序标记(BOM)
每个字符使用2或4个字节
UTF-32
每个字符都是4个字节
必须使用已知的字节顺序进行解析或读取字节顺序标记(BOM)
除非大部分字符来自CJK(中文,日文和韩文)字符空间,否则UTF-8将是最节省空间的。

UTF-32最适合通过字符偏移随机访问字节数组。

UTF8mb3和UTF8mb4的区别
UTF-8是一种用于编码Unicode字符的可变长度字符编码标准。
MySQL中的“utf8”编码只支持最大3字节每字符,就是"utf8mb3"。真正的大家正在使用的UTF-8编码是应该能支持4字节每个字符。他们在2010年增加了一个变通的方法:一个新的字符集“utf8mb4”。
"utf8mb4"和"utf8mb3"则是UTF-8的两个变种。它们的主要区别在于能够表示的字符范围。

1. UTF-8 (Unicode)
最早只有127个字符被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为ASCII编码,但是要处理中文显然一个字节是不够的,至少需要两个字节,而且还不能和ASCII编码冲突,所以,中国制定了GB2312编码,用来把中文编进去。你可以想得到的是,全世界有上百种语言,日本把日文编到Shift_JIS里,韩国把韩文编到Euc-kr里,各国有各国的标准,就会不可避免地出现冲突,结果就是,在多语言混合的文本中,显示出来会有乱码。

因此,Unicode应运而生。Unicode把所有语言都统一到一套编码里,这样就不会再有乱码问题了。现代操作系统和大多数编程语言都直接支持Unicode。

2. UTF8mb3和UTF8mb4
MySQL数据库的 “utf8”并不是真正概念里的 UTF-8,原因上面是一点,还有一点是MySQL中的“utf8”编码只支持最大3字节每字符。真正的大家正在使用的UTF-8编码是应该能支持4字节每个字符。emoji需要4个字节,因此UTF8MB3无法存储emoji。

但其实MYSQL的开发者,并没有修饰这个bug,而是推出了新的字符集,就是UTF-8MB4字符编码。

3. UTF8MB3编码的优缺点
优点
UTF8MB3相对于UTF8MB4而言,存储一个字符所需的空间少一半,所以在存储大量数据时,UTF8MB3的存储更加节省空间。

缺点
UTF8MB3只能表示BMP平面内的字符,若出现超过此范围的字符,有可能无法正常存储或解析。
同时,UTF8MB3中的字符序列不能被直接用于JSON格式类型的数据,这点需特别注意。

 

 银柱网-李银柱个人博客 http://www.liyinzhu.com

posted @ 2024-01-15 21:43  liyinzhu  阅读(715)  评论(0编辑  收藏  举报