mysql中utf8和utf8mb4的区别
MySQL在5.5.3之后加入了这个utf8mb4编码,mb4表示最多4个字节,专门用来兼容四字节的unicode。幸运的是,utf8mb4是utf8的超集,除了将编码改为utf8mb4外,不需要其他转换。当然,为了节省空间,通常使用utf8就足够了。二、内容说明
上面说了,既然utf8可以存储大部分汉字,为什么还要用utf8mb4呢?原来mysql支持的utf8编码最大字符长度为3个字节。如果遇到 4 字节宽的字符,将插入异常。 .三字节UTF-8所能编码的最大Unicode字符为0xffff,即Unicode中的Basic Multilingual Plane (BMP)。也就是说,任何不在 Basic Multitext Plane 中的 Unicode 字符都不能使用 Mysql 的 utf8 字符集存储。包括Emoji表情(Emoji是一种特殊的Unicode编码,常见于ios和android手机),以及很多不常用的汉字,以及任何新的Unicode字符等。
3. 问题根源
最初的 UTF-8 格式使用 1 到 6 个字节,最多可以编码 31 个字符。最新的 UTF-8 规范仅使用一到四个字节,最多可以编码 21 位,刚好足以表示所有 17 个 Unicode 平面。
Utf8是Mysql中的一个字符集,只支持最多三个字节的UTF-8字符,是Unicode中的基本多文本平面。
为什么Mysql中的utf8只支持最多三个字节的UTF-8字符?想了想,可能是Mysql刚开发的时候,Unicode没有辅助平面的缘故。那时,Unicode委还在做着“65535个字符足够全S界使用”的梦想。 Mysql中字符串的长度是按字符数计算的,而不是按字节数计算的。对于CHAR数据类型,需要为字符串预留足够的长度。使用utf8字符集时,需要保留的长度是utf8中最长字符的长度乘以字符串的长度,所以utf8的最大长度被限制为3是很自然的,例如CHAR (100) Mysql会保留300字节的长度。至于为什么后续版本不支持4字节的UTF-8字符,我觉得一是出于向后兼容的考虑,二是Basic Multilingual Plane之外的字符很少使用。
在Mysql中保存4字节的UTF-8字符,需要使用utf8mb4字符集,但只有5.5.3及以后的版本才支持(查看版本:select version();)。我认为为了更好的兼容性,您应该始终使用 utf8mb4 而不是 utf8。对于CHAR类型的数据,utf8mb4会占用更多的空间。根据Mysql官方的建议,使用VARCHAR而不是CHAR。
页:
[1]