前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >实战分析: MySQL字符集

实战分析: MySQL字符集

作者头像
wubx
发布2019-04-24 18:31:11
1.5K0
发布2019-04-24 18:31:11
举报
文章被收录于专栏:MySQLBeginnerMySQLBeginner

实战分析: MySQL字符集说明

在本文中讨论以下几个问题:

1. GBK和UTF8占用几个字节

2. ASCII码在不同字符集中占用几个字节

3. MySQL中UTF8MB4在存储空间中是不是都是占用4个字节?

字符集问题比较枯燥,知数堂MySQL DBA实战班中,经常遇到一些很利害的同学也对字符集一知半解,想着应该有很多同学也存在这个问题。 那么我们把课程中的内部证明方法整理出来,也让大家感受一下:知数堂MySQL DBA的实战班的风格: 就是干。

Q1 GBK和UTF8占用几个字节

首先来看一下,GBK,UTF8在占用几个字节:

从上图可以看出来, 同样一个"知"字

GBK : "d6 aa" 两个字节

UTF8: "e7 9f a5" 三个字节

其中: 0a 相当于"\n" echo 自带的回车符。

从上面信息来 非ASCII码在不同字符集是占用的字节是不一样的。

a

Q2 ASCII码在不同字符集中占用的字节是不是一样

我们再来看看ASCII码在不同字符集下是不是一样

这里可以看出来,ASCII码在GBK和UTF8下内容都是: 61 占用1个字节。

从上面两个例子来看, 字符集这个大老虎,我们可以借助于16进制进行观查。

Q3 MySQL中UTF8MB4在存储空间中是不是都是占用4个字节?

为了简单分析,创建一个只有一个字段的表:tb_varchar

基于字符集环境:

查看一下表里的内容及统计一下字节长度

下面还是使用hexdump来看一下内容:

第一行内容: 10个a 相当于10个61,在上面先找到61及10个,在往前找,可以找到10的标识。

然后可以看到一个09相当于9个字节, 对应着9个61

再往下面看: 07相当于7个字节, 对应7个61

再往下面看: 06相当于6个字节 对应6个61

再往下面看: 08相当于8个字节 对应8个61

再往下面看: 09相当于9个字节 对应: 3个 "e7 9f a5"对应的"知"字

从上面内容来看, ASCII码在UF8下占用也是1个字节,"知"在UTF8MB4下也占用的是3个字节,并非4个字节。

但对于排序这块上层分配应该是按4个字节来分配的,这块代码待确认。

(大家可能会想: 变字长段的长度标识后面到真正字段内容中是什么? 这块是InnoDB行结构的内容,在这里不展开了,如果对InnoDB特别感兴趣,可以关注一下知数堂MySQL DBA优化班,叶老师亲自为你讲解InnoDB的核心结构)

总结

从以上实验可以看出来:

1. GBK和UTF8占用几个字节

答: GBK占用2个字节, UTF8占用3个字节; ASCII码在不同字符集下占用的字节大小是一致的,都是一个字节。

2. ASCII码在不同字符集中占用几个字节

答: ASCII码在不同字符集下占用字节是一致的。非ASCII码在不同字符集占用的字节是不一样的。

3. MySQL中UTF8MB4在存储空间中是不是都是占用4个字节?

答: 在UTF8MB4中并不是所有的字符都占用4个字节, 例如: ASCII码还是占用1个字节, 一般的中文汉字还是占用3个字节,目前知道的emoji表情是占用4个字节。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-11-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 MySQLBeginner 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档