实战分析: 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字符集的更多相关文章
- Java互联网架构-Mysql分库分表订单生成系统实战分析
概述 分库分表的必要性 首先我们来了解一下为什么要做分库分表.在我们的业务(web应用)中,关系型数据库本身比较容易成为系统性能瓶颈,单机存储容量.连接数.处理能力等都很有限,数据库本身的“有状态性” ...
- Mysql字符集设置
转 基本概念 • 字符(Character)是指人类语言中最小的表义符号.例如’A'.’B'等:• 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(Encodi ...
- Mysql字符集知识总结
字符集&字符编码方式 字符集(Character set)是多个字符的集合,字符集种类较多,每个字符集包含的字符个数不同,这里的字符可以是英文字符,汉字字符,或者其他国家语言字符. 常见字符集 ...
- MySQL字符集转换引发插入乱码问题
根据http://www.cnblogs.com/cchust/p/4601536.html进行验证测试 问题背景 在mysql上面执行一条普通的insert语句,结果报错: Incorrect st ...
- 查看mysql字符集及修改表结构--表字符集,字段字符集
MySQL 乱码的根源是的 MySQL 字符集设置不当的问题,本文汇总了有关查看 MySQL 字符集的命令.包括查看 MySQL 数据库服务器字符集.查看 MySQL 数据库字符集,以及数据表和字段的 ...
- MySQL字符集编码
MySQL字符集编码总结 之前内部博客上凯哥分享了一篇关于mysql字符集的文章,之前我对mysql字符集一块基本没有深究过,看到凯哥文章后有些地方有点疑惑,遂自己去看了mysql的官方文档,并參考了 ...
- mysql字符集问题,及排序规则
字符集问题: 基本概念 • 字符(Character)是指人类语言中最小的表义符号.例如’A'.’B'等:• 给定一系列字符,对每个字符赋予一个数值,用数值来代表对应的字符,这一数值就是字符的编码(E ...
- MySQL字符集 GBK、GB2312、UTF8区别 解决 MYSQL中文乱码问题 收藏 MySQL中涉及的几个字符集
MySQL中涉及的几个字符集 character-set-server/default-character-set:服务器字符集,默认情况下所采用的.character-set-database:数据 ...
- MySQL字符集与排序规则总结
字符集与排序规则概念 在数据库当中都有字符集和排序规则的概念, 很多开发人员甚至包括有些DBA都会将这个混淆,当然这个情况也有一些情有可原的原因.一来两者本来就是相辅相成,相互依赖关联: 另外一方 ...
随机推荐
- java-jmx使用
先粘一段内容 .程序初哥一般是写死在程序中,到要改变的时候就去修改代码,然后重新编译发布. .程序熟手则配置在文件中(JAVA一般都是properties文件),到要改变的时候只要修改配置文件,但还是 ...
- Checkpoints(第十一届河南省省赛真题)
题目描述 As a landlocked country in central and southern Africa , the political situation has been relat ...
- POJ 2785 4 Values whose Sum is 0(暴力枚举的优化策略)
题目链接: https://cn.vjudge.net/problem/POJ-2785 The SUM problem can be formulated as follows: given fou ...
- 并发编程之 Thread 类过期方法和常用方法
前言 在 Java 刚诞生时,Thread 类就已经有了很多方法,但这些方法由于一些原因(有一些明显的bug或者设计不合理)有些已经废弃了,但是他们的方法名却是非常的好,真的是浪费.我们在进行并发必编 ...
- 基于Webkit的浏览器关键渲染路径介绍
关键渲染路径概念 浏览器是如何将HTML.JS.CSS.image等资源渲染成可视化的页面的呢?本文简单介绍一下渲染过程中涉及到的关键步骤. 该过程分为四步:模型对象的构建.渲染树构建.布局.绘制. ...
- LoRa术语
ADR Adaptive Data Rate 自适应数据率 AES Advanced Encryption Standard 高级加密标准 AFA ...
- JS 格林威治时间格式(GMT)格式化
Date.prototype.format = function (format) { var o = { "M+": this.getMonth() + 1, //month & ...
- Java并发编程:什么是线程安全,以及并发必须知道的几个概念
废话 众所周知,在Java的知识体系中,并发编程是非常重要的一环,也是面试的必问题,一个好的Java程序员是必须对并发编程这块有所了解的.为了追求成为一个好的Java程序员,我决定从今天开始死磕Jav ...
- AutoMapper在项目中的应用
一.先说说DTO DTO是个什么东东? DTO(Data Transfer Object)就是数据传输对象,说白了就是一个对象,只不过里边全是数据而已. 为什么要用DTO? 1.DTO更注重数据,对领 ...
- Java_万年历(简单)
1.方法,需要一个年份,一个月份.然后在控制台输出日历 // 输入一个年份和一个月份显示日历 public static void printCalendar(int year, int month) ...