Mysql字符集utf8和utf8mb4

背景:

1、MySQL在5.5.3版本之后增加了utf8mb4的编码,mb4就是most bytes 4的意思,专门用来兼容四字节的unicode;

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

名词解释:

字符集(character set/charset):字符的二进制编码方式;

UTF-8:是unicode的实现方式之一,其他实现方式还有utf-16,utf-32,它是一种变长的编码,一个符号使用1~4个字节表示;

utf8:mysql中实现了utf-8编码的unicode字符集,是utf8mb3的别称,utf8编码中一个符号使用1~3个字节表示;

utf8mb4:mysql中实现了

关系:

1、都实现了utf-8编码中的的unicode字符集;

2、utf8仅支持基本多语言平面Basic Multilingual Plane (BMP);

3、utf8mb4支持BMP之外的补充字符,如一些生僻的汉字,emoji字符,以及任何新增的unicode字符。

4、utf8一个字符最多使用3个字节存储,utf8mb4一个字符最多使用4个字节存储;

5、对于BPM字符,utf8和utf8mb4都使用三个字节存储;对于非BMP字符,utf8mb4使用4个字节存储,utf8不能存储非BMP字符;

6、InnoDB中默认最大可对767个字节建立索引;使用utf8的列最多可对255个字符建立索引;使用utf8mb4的最多可对191个字符建立索引;

实践:

为了验证上面的理论,创建如下两个表:它们的字符集分别为utf8和utf8mb4

CREATE TABLE `test_utf8` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(5) NOT NULL COMMENT '名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='测试utf8';

CREATE TABLE `test_utf8mb4` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(5) NOT NULL COMMENT '名称',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='测试utf8mb4';

向两个表中分别插入如下数据:

insert into test_utf8(name) values ('我是一颗小'), ('我是reo'), ('12345'), ('ggvdc');
insert into test_utf8mb4(name) values ('我是一颗小'), ('我是reo'), ('12345'), ('ggvdc');
insert into test_utf8mb4(name) values ('?????');

查看在两种字符集下的存储长度:

 

该图验证了上面3、4、5点理论;

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值