oracle数据库中,char和varchar2数据类型用来存储字符数据。char类型一旦定义多大,那么它就分配多少字节空间;varchar2类型定义多大,代表它可以扩展的最大大小为多大,一开始空间根据使用来决定。字符数据存储在oracle表列中,对于使用者,不需要去管它底层的存储格式是怎样。但对于想深入学习数据库的人来说,还是可以去了解下其具体的存储格式是这样的。
一、环境搭建
1.1,创建表
我们先创建一个测试表t_code,并插入数据:
1.2,查看表段区信息
1.3,根据数据rowid,获取数据文件号和数据块id:
二、数据存储格式分析
2.1,dump数据块
我们先把存储数据的数据块进行dump,便于后续的存储格式比对。
2.2,dump文本数据
我们通过oracle内置的dump函数,进行name和bj字段的底层存储数据的查看:
(16进制格式)
(10进制)
2.3,比对
我们查看下dump数据块出来的数据,比对下前端dump函数出来的数据,对比下:
可以看到,两边数据一样
三、说明
oracle内部,varchar2数据类型的内部代表码为1,也就是上面图中的TYP=1;char数据类型的内部代表码为96,也就是上面图中的TYP=96。根据这个内部码,oracle内部程序就知道该表该列的类型具体为什么。
而len=5,就告知了这个字段存储所占为5个字节。
我们写个简单的c语言程序,直接解析下上述的数据:
t_oracle(){int a[] = {116,97,98,108,101};printf("tale t_code's first row column name is: ");for(int i=0;i<5;i++){printf("%c",a[i]);}printf("\n");printf("tale t_code's first row column bj is: ");int bj = 49;printf("%c",bj);
}int main() {t_oracle();}
可以看到,我们直接就获取到第一行的name字段值为“table”,而bj字段值为“1"。深入想想,我们是否可以自己程序去读取数据文件块中的存储数据?