深入解析下oracle date底层存储方式

    之前我们介绍了varchar2和char的数据库底层存储格式,今天我们介绍下date类型的数据存储格式,并通过测试程序快速获取一个日期。

一、环境搭建

1.1,创建表

    我们还是创建一个测试表t_code,并插入数据:

1.2,根据数据rowid,获取数据文件号和数据块id

二、数据存储格式导出

2.1,dump数据块

    我们先把存储数据的数据块进行dump,便于后续的存储格式比对。

2.2,dump文本数据

    我们通过oracle内置的dump函数,进行name和bj字段的底层存储数据的查看:

(16进制格式)

(10进制)

2.3,比对

    我们查看下dump数据块出来的数据,比对下前端dump函数出来的数据,对比下:

    可以看到,两边数据一样

 

三、说明

    oracle内部,date数据类型的内部代表码为12,也就是上面图中的TYP=12。根据这个内部码,oracle内部程序就知道该表该列的类型具体为什么。

    len=7,就告知了这个字段存储所占为7个字节。第一个字节:代表世纪,需要减去100获取实际值(120-100=20);第二个字节,代表年份,也需要减去100获取实际值(124-100=24);第三个字节代表月份(11);第四个字节代表天数(26);第五个字节代表小时,需要减去1获取实际值(5-1=4);第六个字节代表分钟,需要减去1获取实际值(23-1=22);第五个字节代表秒,需要减去1获取实际值(1-1=0)。

    我们写个简单的c语言程序,直接解析下上述的数据:

t_date(){
    int a[] = {120,124,11,26,5,23,1};
    int cent = a[0]-100;
    int year = a[1]-100;
    int month = a[2];
    int day = a[3];
    int hour = a[4]-1;
    int minute = a[5]-1;
    int second = a[6]-1;

    printf("获取时间为:%d%d-%d-%d %d:%d:%02d",cent,year,month,day,hour,minute,second);
}




int main() {
    t_date();

}

 

    我们测试的第一行数据,可以看到与直接的日期数据一模一样。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TPCloud

你的鼓励将是我创作的最大动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值