ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

你知道 mysql varchar字段是怎么存储的吗?

2021-02-02 21:06:24  阅读:223  来源: 互联网

标签:存储 varchar java 列表 字段 变长 mysql 长度


大家对mysql一定不陌生吧,平时我们使用一些增删改查呀,无非就是对某个数据库的一些表,一些字段进行操作,这些都是抽象的概论,那么你知道对数据页中的每一行数据,他在磁盘上是怎么存储的?

其实这里涉及到一个概念,就是行格式。

Mysql 目前有4种行格式:Redundant、Compact、Dynamic、Compressed,其中Compact和Dynamic应用较广泛,本文主要介绍Compact格式,Dynamic与Compact行格式很像,差异在于页面溢出的处理上;

Compact

格式:

变长字段(记录的长度)列表  +  NULL列表  + 记录头信息  + 列值

变长字段(记录的长度)列表:

  • 采用1-2个字节来表示一个字段的长度,逆序;
  • 字段最大长度<= 255字节用1个字节表示;大于255字节,但是实际使用字节<=127,也使用1个字节来表示;其他情况使用2个字节来表示;
  • char如果是变长字符集(GBK、UTF8)也会需要使用变长字段列表来存储字段使用的长度;

NULL列表:

  • 逆序,存储每条记录中允许为NULL的字段,将实际为NULL的字段用1表示,实际不为NULL的字段用0表示;
  • 每一列不是用一个字节来表示,而是用一个位来表示;

记录头信息:

  • 使用5个字节来表示;
  • 主要包含:该记录是否被删除,记录类型,下一条记录的相对偏移量

变长字段在磁盘中是怎么存储的?

众所周知,在MySQL里有一些字段的长度是不固定的,比如VARCHAR这种类型的字段,它里面存放的字符串可能是"java"这么一个字符串,也可能是"a"这么一个字符串。

那么如果现在有一行数据,他的几个字段为VRACHAR(10),CHAR(1),由于第一个字段的长度是变化的,那么这一行数据可能是:java a,也可能是:python a

那么mysql总得把这行数据写入磁盘文件中吧,假设mysql已经把上述两条数据写入了一个磁盘文件里,两行数据是挨在一起的,那么mysql是怎么正确的区分每一个字段的呢?

变长字段长度列表

变长字段长度列表就是来解决这个问题的,mysql 是知道我们每个字段的类型的,比如这里我们用的是VARCHAR(10) CHAR(1),假设你要读取"java a"这行数据,那么此时你先要读取第一个字段的值,那么第一个字段是变长的,到底他的实际长度是多少呢?

此时你会发现第一行数据的开头有一个变长字段的长度列表,里面会读取到一个0x04这个十六进制的数字,发现第一个变长字段的长度是4,于是按照长度为4来读第一个字段的值,就是"java",接着由于后面一个字段是CHAR(1),长度都是固定的,1个字符,于是此时就按照长度为1读取下一个字段的值。

于是最终你会读取出来"java a"这一行数据。


那么如果有多个变长字段,如何存放他们的长度?
比如一行数据有VARCHAR(10) VARCHAR(20) CHAR(2) ,3个字段,其中第一二个字段是变长字段。
那么一行数据可能是:python java go

那么在磁盘中存储时,必须在他开头的变长字段长度列表中存储几个变长字段的长度,注意变长字段长度列表是逆序存储的!

也就是说先存放VARCHAR(20)这个字段的长度,然后存VARCHAR(10)这个字段的长度。

所以一行数据实际存储可能是下面这样的:
0x04 0x06 null值列表 记录头信息 python java go

标签:存储,varchar,java,列表,字段,变长,mysql,长度
来源: https://blog.csdn.net/weixin_42494845/article/details/113571755

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有