原创: 吴炳锡 MySQLBeginner
实战分析: 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个字节。

你的转发,留言就是最大的支持。

实战分析: MySQL字符集的更多相关文章

  1. Java互联网架构-Mysql分库分表订单生成系统实战分析

    概述 分库分表的必要性 首先我们来了解一下为什么要做分库分表.在我们的业务(web应用)中,关系型数据库本身比较容易成为系统性能瓶颈,单机存储容量.连接数.处理能力等都很有限,数据库本身的“有状态性” ...

  2. Mysql字符集设置

    转 基本概念 • 字符(Character)是指人类语言中最小的表义符号.例如’A'.’B'等:• 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encodi ...

  3. Mysql字符集知识总结

    字符集&字符编码方式 字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,这里的字符可以是英文字符,汉字字符,或者其他国家语言字符. 常见字符集 ...

  4. MySQL字符集转换引发插入乱码问题

    根据http://www.cnblogs.com/cchust/p/4601536.html进行验证测试 问题背景 在mysql上面执行一条普通的insert语句,结果报错: Incorrect st ...

  5. 查看mysql字符集及修改表结构--表字符集,字段字符集

    MySQL 乱码的根源是的 MySQL 字符集设置不当的问题,本文汇总了有关查看 MySQL 字符集的命令.包括查看 MySQL 数据库服务器字符集.查看 MySQL 数据库字符集,以及数据表和字段的 ...

  6. MySQL字符集编码

    MySQL字符集编码总结 之前内部博客上凯哥分享了一篇关于mysql字符集的文章,之前我对mysql字符集一块基本没有深究过,看到凯哥文章后有些地方有点疑惑,遂自己去看了mysql的官方文档,并參考了 ...

  7. mysql字符集问题,及排序规则

    字符集问题: 基本概念 • 字符(Character)是指人类语言中最小的表义符号.例如’A'.’B'等:• 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(E ...

  8. MySQL字符集 GBK、GB2312、UTF8区别 解决 MYSQL中文乱码问题 收藏 MySQL中涉及的几个字符集

    MySQL中涉及的几个字符集 character-set-server/default-character-set:服务器字符集,默认情况下所采用的.character-set-database:数据 ...

  9. MySQL字符集与排序规则总结

      字符集与排序规则概念 在数据库当中都有字符集和排序规则的概念, 很多开发人员甚至包括有些DBA都会将这个混淆,当然这个情况也有一些情有可原的原因.一来两者本来就是相辅相成,相互依赖关联: 另外一方 ...

随机推荐

  1. VIM学习网址和资料收集

     摘要:这篇博客主要收集一些学习VIM的好网址和资料 娄老师的一篇VIM 原文地址:http://www.cnblogs.com/rocedu/p/6012444.html Github上VIM的学习 ...

  2. Flutter踩坑日记:接入现有iOS项目

    之前搞的Flutter版工具链已经弄完了,感兴趣的朋友可以围观下,Android版本dio库(v2.0.14)发送网络请求老是报错,去官方提了issue还没回,于是今天搞一下把Flutter模块接入到 ...

  3. 【IT笔试面试题整理】丑数

    [试题描述]我们把只包含因子2.3和5的数称作丑数.求按从到大的顺序的第1500个丑数.例如6,8是丑数,而14不是,因为它包含因子7.习惯上把1当作第一个丑数. 根据丑数的定义,丑数应该是另一个丑数 ...

  4. 最短路径算法----floyd(转)

    一.Floyd算法 假设从i到j的最短路径上要经过若干个顶点,这些中间顶点中最大的顶点编号为k,最小的顶点为t,因此要求算dist[i][j]的最小值,那么只需要求算dist[i][s]+dist[s ...

  5. MQ5.3在redhat9上的安装

    一.准备工作 1.安装linux软件包 确保系统中有libgcc_s.so和libstdc++.so.3. 如无意外,libgcc_s.so在redhat中已经存在,存放路径为:/usr/lib/gc ...

  6. 【nginx笔记】系统参数设置-使Nginx支持更多并发请求的TCP网络参数

    首先,需要修改/etc/sysctl.conf来更改内核参数.例如,最常用的配置: fs.file-max = 999999 net.ipv4.tcp_tw_reuse = 1 net.ipv4.tc ...

  7. es6学习笔记8--Map数据结构

    Map Map结构的目的和基本用法 JavaScript的对象(Object),本质上是键值对的集合(Hash结构),但是只能用字符串当作键.这给它的使用带来了很大的限制. var data = {} ...

  8. Git 使用SSH密钥操作

    git使用ssh密钥 git支持https和git两种传输协议,github分享链接时会有两种协议可选: git协议链接图例 : ↓ https协议链接图例:↓ git使用https协议,每次pull ...

  9. MVC应用程序,动态创建单选列表(RadioButtonList)

    单选列表是多个选项,让用户选择一个.MVC应用程序开发中,少之不了.下面就来练习之个小功能. 这个练习,Insus.NET想实现一个日期显示的格式.在MVC中,得需从model开始创建: 再创建一个E ...

  10. Hibernate中的三种数据状态

    Hibernate中的三种数据状态(临时.持久.游离) 1.临时态(瞬时态) 不存在于session中,也不存在于数据库中的数据,被称为临时态. 比如:刚刚使用new关键字创建出的对象. 2.持久态 ...