前言
上篇《VARCHAR(M) 到底占用多少个字节?|mysql系列(2)》分享了VARCHAR(M) 占用多少个字节,那VARCHAR 最大能存多少个字符呢?以及了解这些对我们平时的开发工作中有什么帮助呢?那我们就要了解下存储引擎中是怎么来处理数据的。这里我们还是以InnoDB 为例。
InnoDB数据记录的结构
在《执行sql 语句时发生了什么?|mysql 系列(1)》一文中讲到,MySQL服务器上负责对表中数据的读取和落盘(即写入磁盘)工作是由存储引擎 完成的。InnoDB是一个将表中的数据存储到磁盘上的存储引擎 。这也是mysql 持久化的保证。插入的数据记录在磁盘上的存放方式被称为行格式或者记录格式。Mysql 目前有4种行格式:Redundant、Compact、Dynamic、Compressed.
其中:
Redundant 目前貌似很少使用了。
可以用下面的语句来查看行格式。
我们以常用的Compact、Dynamic、Compressed 行格式为例。一条完整的记录其实可以被分为 记录的额外信息 和记录的真实数据两大部分 。Compact、Dynamic、Compressed行格式不同的地方在记录的真实数据部分。我们寻求答案的地方在记录的额外信息里面。
记录的额外信息
记录的额外信息包括:变长字段长度列表、NULL值列表和记录头信息。
变长字段长度列表: 比如VARCHAR(M)、VARBINARY(M)、各种TEXT类型,各种BLOB类型,把拥有这些数据类型的列称为变长字段
变长字段占用的存储空间分为两部分:
真实数据内容是就是存的具体的值。那么对于占用的字节数该怎么表示呢?
如果列中的字符串都比较短,也就是说内容占用的字节数比较小,用1个字节就可以表示,但是如果变长列的内容占用的字节数比较多,可能就需要用2个字节来表示。具体用1个还是2个字节来表示真实数据占用的字节数。
对于VARCHAR(M)来说:
如果M×L <= 255,那么使用1个字节来表示真正字符串占用的字节数。
如果M×L >255,则分为两种情况:
所以,如果最多有2个字节来表示真正字符串占用的字节数的话。2个字节能表示最大的数为: 16个2进制位 也就是2的16次方= 65535 。如果VARCHAR(M)类型的列使用的不是ascii字符集,那M的最大取值取决于该字符集表示一个字符最多需要的字节数。
举个例子:
以上就是今天的分享,欢迎拍砖!
mysql基础知识系列,阅读人数出乎我的意料之外,看来大家对mysql还是比较感兴趣,同时也有一些小伙伴有些疑惑,在这里一一解答下。1、该系列的阅读对象是谁?
诚然,MySQL和SQL Server数据库的语法大部分都是遵循SQL的标准的,但是在使用过程中还是有些差别,特别是有些小白同学感觉这就是两个数据库,两种语法。
所以该系列的读者对象主要是小白同学或对MySQL和SQL Server之间的区别不太了解的初学者准备的。如果你对两个数据库的SQL语法烂熟于心,可以忽略,当然也欢迎大家进行勘误(上次就写错了一个语法)。
2、该系列与《SQL基础知识》有什么明显的不同?
《SQL基础知识》经过两个版本的迭代,把SQL Server的一些基础语法基本全部囊括进去了,而MySQL基础知识系列在沿用《SQL基础知识》系列的基础上,会对一些使用过程中容易出错的地方进行较长篇幅的讲解或注释,内容上会更加详细。
此外还会把MySQL独有或者与其他数据库不同的的一些语法进行强调。
3、该系列什么时候能出完?
进度需要根据现实情况而定,由于我本身也是一名数据库开发工程师,和大多数程序员类似,也会经常加班,只有下班才有时间写作。
虽然很多知识点都比较类似,但是还是会对每一段代码进行测试和截图,所以还是会需要一定的时间,有时候下班太晚,你们第二天可能就看不到了,但是可以保证在三个月内出完。
到时候还是会以汇总链接+PDF的形式进行汇总整理,方便大家阅读和学习。
4、会像《SQL基础知识》系列,出高级知识吗?
会的,其实MySQL与SQL Server最大的不同就在于高级知识部分,包括一些系统函数,存储过程,变量,临时表,触发器等等的使用都是不大一样的。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)