建库,建表,插入数据
启动dbaccess
dbaccess - - |
建库,建表,插入数据:
drop database if exists dbtype ; create database dbtype with log; create table t_smallint(c1 smallint) in dbs1; insert into t_smallint values(-32767); insert into t_smallint values(0); insert into t_smallint values(32767); insert into t_smallint values(NULL); |
数据的选择是:最小值,中间值,最大值,空值。
找到数据的rowid
> select c1, rowid from t_smallint; c1 rowid -32767 257 0 258 32767 259 260 4 row(s) retrieved. |
找到数据的物理位置
通过oncheck命令,可以根据库名,表名,rowid,找到数据的物理位置。
该命令会打印该rowid 所在的页的所有row 信息。
[root@localhost ids]# oncheck -pp dbtype:t_smallint 257 addr stamp chksum nslots flag type frptr frcnt next prev 14:54 5997076 8277 4 1 DATA 32 1996 0 0 slot ptr len flg 1 24 2 0 2 26 2 0 3 28 2 0 4 30 2 0 slot 1: 0: 80 1 ................ slot 2: 0: 0 0 ................ slot 3: 0: 7f ff ................ slot 4: 0: 80 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 1e00 0200 ................ 001b7f0: 1c00 0200 1a00 0200 1800 0200 1482 5b00 ..............[. |
其中一个slot指向一行数据,一个slot占用4个字节,如上图,1800 0200是第一个slot,指向第一行数据,含义是:从0x18字节开始,长度是0x02字节。
以此类推,1a00 0200 指向第二行,1c00 0200指向第三行,1e00 0200指向第四行。
查看数据
根据slot指向的位置,查看数据,如下:
001b000: 3600 0000 0e00 7782 0400 0108 2000 cc07 6.....w..... ... 001b010: 0000 0000 0000 0000 8001 0000 7fff 8000 ................ 001b020: 0000 0000 0000 0000 0000 0000 0000 0000 ................ |
第一行数据:-32767, 就是图中的8001
第二行数据:0,就是图中的0000
第三行数据:32767,就是图中的7fff
第四行数据:NULL,就是图中的8000.
我们看到数据库中的smallint和 c语言中的short(2字节整数)的值域基本一致,区别在于:
gbase8s中的smallint | c语言中的short | |
值域 | -32767 ~ 32767 | -32768~32767 |
空值 | 有,用-32768表示 | 无 |