Innodb 文件结构分析 (二) – 数据存储类型

在Mysql当中,数据类型可以分为三大类:数值类型、日期和时间类型、字符类型;每个类型又可以详细划分为数个详细的子类,

需要注意的是有些类型是底层的数据类型的别名,举个例子:

mysql> create table dtype (id bool);
Query OK, 0 rows affected (0.03 sec)
mysql> show create table dtype \G
*************************** 1. row ***************************
       Table: dtype
Create Table: CREATE TABLE `dtype` (
  `id` tinyint(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)

mysql> 

从这里可以看到底层的存储仍然是 tinyint 的;下面详细看看各个具体的分类与存储方式:

数值

dt1

在数值类型当中需要注意的是float 类型,其长度是4byte 或者8byte,如果是Float(x)x>24则为8byte否则为4byte,如果是float(x,y) 则为4byte;这里把bit放入到数值类型当中,是因为bit的底层存储是二进制的,就是0和1组成的数字,所以我放到这里,是自己的一个习惯性做法不通用;知道了每个数值类型的长度那么在进行数据文件的的行解析时,就能判断每个类型的长度,这样就比较容易直接转换数据;那么数值在底层是如果转换存储的呢? 以tiny int 为例子,其长度是1byte,而1byte 是8bit,bit从存储是二进制的,也就说1一个byte 可以存储的最大的值为 1111 11111,转换为10进制就是 255 ,也就是0–255 ,如果按照这种计算方式,存储的全部为正数这种情况是mysql unsigned方式,如果有负数呢,如果是有正负数的情况,此时会使用 第一个 bit 作为正负的标志位,正数为1,负数为0,所以此时有7个bit位是作为数值的存储的,也就是 +-127;

数值的存储方式大多如此,那么数值类型当中有特殊情况的是:decimal类型,在之前的版本中decimal实际是以字符串的形式进行存储的在大当前版本中是binary方式,同时需要注意如何计算decimal的长度;decimal 的整数部分每9个数字占用4个字节,小数部分也是如此,不足9个数字的按照下面的方式进行计算:

dt2

因为decimal 是由定义长度决定存储长度的,所以在文件解析时需要特别对待;其它的类型基本都是固定长度;

日期时间:

dt4

日期与时间类似是固定长度的,但是存储长度还是有一定的变化的,如上图图所示:

字符类型包括:

dt5

对于字符类型来说需要,明确binary strings 和character strings 的区别;

在myql当中还包含其他的类别的数据类型,这里不一一介绍,主要介绍的是常用的类型;

从上面的分析可以看出,知道数据类型的定义后,就可以清楚的判断出row 在存储时,每个列的长度,这样对于数据的解析有很好的帮助,如果不知道类的类型,那么有可能只能去猜测,这样就会存在各种误差;

发表评论

电子邮件地址不会被公开。 必填项已用*标注