技术开发 频道

MYISAM 静态格式数据存储结构

  

       IT168技术文档1. 从简单的例子开始

  1.1 创建测试数据

  drop table if exists heyf_5 ;

  create table heyf_5 (id int , name char(10),addr char(20)) engine myisam ;

  insert into heyf_5 values (12,'hyf','street-1') ,(13,'steven','street-2') ;

  system hexdump /opt/mysql/data/test/heyf_5.MYD

  ------------------------------------------------

  0000000 0cf1 0000 6800 6679 2020 2020 2020 7320

  0000010 7274 6565 2d74 2031 2020 2020 2020 2020

  0000020 2020 f120 000d 0000 7473 7665 6e65 2020

  0000030 2020 7473 6572 7465 322d 2020 2020 2020

  0000040 2020 2020 2020

  -----------------------------------------------------

  --由于我们这一节讨论的是静态格式,我们这里取的数据类型都是固定长度的.

  1.2 开始读取数据

  --根据我们所定义的数据特征,我们能容易地从数据中分出各行:

  ROW1: 0cf1 0000 6800 6679 2020 2020 2020 7320 7274 6565 2d74 2031 2020 2020 2020 2020 2020 20

  ROW2: f1 000d 0000 7473 7665 6e65 2020 2020 7473 6572 7465 322d 2020 2020 2020 2020 2020 2020

  我们拿第一行数据来分析:

  由于数据存储在硬盘里时,双字节是低位先存储,高位后存储.所以我们读数据的时候要反过来一下:

  ROW1: f1 0c 00 00 00 68 79 66 20 20 20 20 20 20 20 73 74 72 65 65 74 2d 31 20 ... 20

  其中:

  -----------------------------------------------------

  f1 : Header (0>非NULL,1>NULL),

  在这里 1111 0001 ,其中三个"0"表示三个可空字段,并且没有为NULL的字段.

  --下面开始就是实际的值

  0c 00 00 00 : COLUMN ID INT , 4个字节,在这里表示12.

  68 79 66 20 20 20 20 20 20 20 : COLUMN name char(10) 20个字节 ,这里十六进制转换成字符刚好是"hyf",其它填空.

  73 74 72 65 65 74 2d 31 20 ... 20 : COLUMN addr char(20) ,20个字节

  -----------------------------------------------------

  有兴趣的同学们同样可以用同样的方法分析一下ROW2的数据.

  由于固定格式的数据,每个字段的长度都是固定的,所以读取数据的时候特别容易计算字段的长度和行的长度.

0
相关文章