建库,建表,插入数据
启动dbaccess
dbaccess - - |
建库,建表,插入数据:
drop database if exists dbtype ; create database dbtype with log; create table t_int(c1 int) in dbs1; insert into t_int values((-1)*(pow(2,31)-1)); insert into t_int values(0); insert into t_int values(pow(2,31)-1); insert into t_int values(NULL); |
数据的选择是:最小值,中间值,最大值,空值。
找到数据的rowid
> select c1,rowid from t_int; c1 rowid -2147483647 257 0 258 2147483647 259 260 4 row(s) retrieved. |
找到数据的物理位置
通过oncheck命令,可以根据库名,表名,rowid,找到数据的物理位置。
[root@localhost ids]# oncheck -pp dbtype:t_int 257 addr stamp chksum nslots flag type frptr frcnt next prev 14:54 6158089 f76c 4 1 DATA 40 1988 0 0 slot ptr len flg 1 24 4 0 2 28 4 0 3 32 4 0 4 36 4 0 slot 1: 0: 80 0 0 1 ................ slot 2: 0: 0 0 0 0 ................ slot 3: 0: 7f ff ff ff ................ slot 4: 0: 80 0 0 0 ................ |
14:54的含义是第14个chunk的54页。
查看数据文件
确保数据落地
强制执行一次检查点,可以确保刚才插入的数据落地。
[root@localhost ids]# onmode –c |
打开文件
用16进制的方式,打开数据文件
vi /home/ids/storage/dbs1 %!xxd |
根据数据所在的地址 14:54计算出数据所在的位置:
查看slot
2048*54 = 0x1b000,也就是关心的数据从0x1b000开始的,
先从slot看起。
这个页的页尾:
001b7e0: 0000 0000 0000 0000 0000 0000 2400 0400 ............$... 001b7f0: 2000 0400 1c00 0400 1800 0400 09f7 5d00 .............]. |
其中一个slot指向一行数据,一个slot占用4个字节,如上图,1800 0400是第一个slot,指向第一行数据,含义是:从0x0018字节开始,长度是0x0004字节。
以此类推,1c00 0400指向第二行,2000 0400指向第三行,2400 0400指向第四行。
查看数据
根据slot指向的位置,查看数据,如下:
001b000: 3600 0000 0e00 6cf7 0400 0108 2800 c407 6.....l.....(... 001b010: 0000 0000 0000 0000 8000 0001 0000 0000 ................ 001b020: 7fff ffff 8000 0000 0000 0000 0000 0000 ................ |
第一行数据:-2147483647, 就是图中的8000 0001
第二行数据:0,就是图中的0000 0000
第三行数据:2147483647,就是图中的7fff ffff
第四行数据:NULL,就是图中的8000 0000
我们看到数据库中的int和 c语言中的int(2字节整数)的值域基本一致,区别在于:
gbase8s中的int | c语言中的short | |
值域 | -1*(pow(2,31)-1) ~ pow(2,31) - 1 | -1*pow(2,31) ~pow(2,31) – 1 |
空值 | 有,用-1*pow(2,31) 表示 | 无 |