mysql中utf8和utf8mb4区别

utf8mb4 的出现

MySQL 在 5.5.3 之后增加了这个 utf8mb4 的编码,mb4 就是 most bytes 4 的意思,专门用来兼容四字节的 unicode。

好在 utf8mb4 是 utf8 的超集,除了将编码改为 utf8mb4 外不需要做其他转换。当然,为了节省空间,一般情况下使用 utf8 也就够了。

为什么要用utf8mb4

那上面说了既然 utf8 能够存下大部分中文汉字,那为什么还要使用 utf8mb4 呢?

原来 mysql 支持的 utf8 编码最大字符长度为 3 字节,如果遇到 4 字节的宽字符就会插入异常了。

三个字节的 UTF-8 最大能编码的 Unicode 字符是 0xffff,也就是 Unicode 中的基本多文种平面(BMP)。

也就是说,任何不在基本多文本平面的 Unicode 字符,都无法使用 Mysql 的 utf8 字符集存储。

包括 Emoji 表情(Emoji 是一种特殊的 Unicode 编码,常见于 ios 和 android 手机上),和很多不常用的汉字,以及任何新增的 Unicode 字符等等。

其他拓展

建议普通表使用 utf8 如果这个表需要支持 emoji 就使用 utf8mb4

新建 mysql 库或者表的时候还有一个排序规则

utf8_unicode_ci 比较准确,utf8_general_ci 速度比较快。通常情况下 utf8_general_ci 的准确性就够我们用的了,在我看过很多程序源码后,发现它们大多数也用的是 utf8_general_ci,所以新建数据 库时一般选用 utf8_general_ci 就可以了

mysql 字符版本

mysql 中 utf8 和 utf8mb4 区别

额外篇——字符编码详细介绍

ASCII 编码

ASCII 占用 8 位(bit)。8 个 bit 可以表示 256 个字符。

ASCII 码只规定了 128 个字符的编码。

ASCII 码的问题是字符太少,不能满足世界各国的需要。所以各国其他编码利用剩余的 128 个字符定义各自不同的编码。

GB2312 & GBK

汉字 GB2312 使用两个字节(16 位),最多表示 65536 个字符。

一个小于 127 的字符的意义与原来相同,但两个大于 127 的字符连在一起时,就表示一个汉字,前面的一个字节(他称之为高字节)从 0xA1 用到 0xF7,后面一个字节(低字节)从 0xA1 到 0xFE

gb2312 中两个字符组成的编码的字符叫做“全角”字符,而原来在 127 号以下的那些就叫”半角”字符了

对 GB2312 扩展就得到了 GBK,再扩展得到 GB18030(少数民族文字)。

所以,一个字节小于 127 的编码都按照 ASCII 码查,大于 127 的字节+之后的字节(一共两个字节 16 位)组成汉字的编码。

所以,“一个汉字两个英文字符”就是这么来的。

Unicode

为了统一一种编码,Unicode 出现了。

Unicode 目前规划的总空间是 17 个平面(平面 0 至 16),0x0000 至 0x10FFFF。最前面的 65536 个字符位,称为基本平面(缩写 BMP) 。每个平面有 65536 个码点。

Unicode 只规定了每个字符的码点,到底用什么样的字节序表示这个码点,就涉及到编码方法。

最直观的编码方案就是 UTF-32

UTF-32

由于 Unicode 是 0x0000 至 0x10FFFF,直接用定长的 4 个字节来表示对应的字符

U+0000 = 0x0000 0000
U+597D = 0x0000 597D

这样好处是直观,但是太浪费空间了。

UTF-8

UTF-8 是一种变长的编码,从 1 字节到 4 字节。

英文字母为 1 个字节,汉字为 3 个字节。

Unicode 符号范围 | UTF-8 编码方式

(十六进制) | (二进制)

—————————————————————–

0000 0000-0000 007F | 0xxxxxxx

0000 0080-0000 07FF | 110xxxxx 10xxxxxx

0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx

0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

 

mysql 中 utf8 和 utf8mb4 区别

Reference 字符编码的演变

中国人民通过对 ASCII 编码的中文扩充改造,产生了 GB2312 编码,可以表示 6000 多个常用汉字。

汉字实在是太多了,包括繁体和各种字符,于是产生了 GBK 编码,它包括了 GB2312 中的编码,同时扩充了很多。

中国是个多民族国家,各个民族几乎都有自己独立的语言系统,为了表示那些字符,继续把 GBK 编码扩充为 GB18030 编码。

每个国家都像中国一样,把自己的语言编码,于是出现了各种各样的编码,如果你不安装相应的编码,就无法解释相应编码想表达的内容。

终于,有个叫 ISO 的组织看不下去了。他们一起创造了一种编码 UNICODE ,这种编码非常大,大到可以容纳世界上任何一个文字和标志。所以只要电脑上有 UNICODE 这种编码系统,无论是全球哪种文字,只需要保存文件的时候,保存成 UNICODE 编码就可以被其他电脑正常解释。

UNICODE 在网络传输中,出现了两个标准 UTF-8 和 UTF-16,分别每次传输 8 个位和 16 个位。于是就会有人产生疑问,UTF-8 既然能保存那么多文字、符号,为什么国内还有这么多使用 GBK 等编码的人?因为 UTF-8 等编码体积比较大,占电脑空间比较多,如果面向的使用人群绝大部分都是中国人,用 GBK 等编码也可以。


IT 敢客 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:mysql 中 utf8 和 utf8mb4 区别
喜欢 (2)
[313176056@qq.com]
分享 (0)
IT敢客
关于作者:
“我所做的一切都是为了方便我的生活~~~“
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址