目标:在oracle服务中确认数据类型的内部构造
解释数据类型在内部是如何存储的
内部存储知识
能更好的解释和分析块dumps
某些崩溃诊断必须的技能
帮助客户分析各种存储问题
是明白内部事务的必须步骤
oracle数据类型
数据类型包含:
内置数据类型
用户自定义数据类型
结构型对象类型
聚合型
VARRAYS
嵌套表
引用类型(引用对象类型)
注意的是,oracle为程序提供了很多种数据类型,例如数字格式的:number,integer,float,decimal字符格式的:char,charz,string,varchar内部数据类型从内部向外部自动的由oracle来转换。
内置数据类型
char,nchar,varchar2,nvarchar2
number
raw
long,long raw
date datetime以及时间间隔类型
clob,blob,nclob,bfile
rowid,urowid
列中的数据取决于列的数据类型,但是数据类型并不是存储列数据的块中,本章以及后续课程将使用sql dump函数。范例中列的名字为TYP,关联的内部代码是各种数据类型,内部代码存储在数据字典中,在表col$的列type#下。
char和varchar2
字符类型数据通常是以数据库的字符集(单字节)存储的char固定长度的字符串,最多2000字符;内部代码:96 varchar2浮动长度字符串,最多4000字符内部代码:1为了能识别dump的输出文件,必须要知道他们存储的代码页。
char在char类型的列中,所有的空字节被空格(代码32)填充长度固定由于char类型代码为96,长度固定,因此很容易分辨出那些是用来填充的空格
varchar2 varchar2列中,将不用空格填充。
长度不固定
nchar和nvarchar2字符数据也可以使用国家字符集(多字节)设置存储nchar固定长度,最多2000字节内部代码:96 nvarchar2浮动长度,最多4000字节内部代码:1
number数字类型内部存储是一个字节的变长阿拉伯数字数组数字类型有以下格式< [length]>,sign bit/expornent,digit1,digit2,……,digit20内部代码:2注意的是,number和float有同样的内部特性。
指数类型指数字节包含三个部分:符号位:是整个字节的最高位(128)
如果是0,则数字是负数如果是1,则数字是正数或者0偏移量:总是65指数:范围为-65到62标示该数字100为基础的科学记数法如果指数是200=128+65+7,那么指数就是7,因此数据应该是大于100的7次方如果一个数字是服侍,指数也同样的计算,但是要从255翻转,例如,一个指数为7的负数的计算是:-(125+65+7)=-(200)=255-200=77偏移量使得负数的指数不需要使用别的字节来作为指数标志如果第一个字节大于128,那么数字是正的:exponent=first byte 128 -65=first bytes193如果第一个字节小于128,那么数字是负的:exponent=(255-first byte)-128-65=62-first byte
digits大部分数字的最高位是digit1使用100作为基数(每一个数字是0-99之间)
对于正数:对于每个digit使用进位(1…100)
对于负数:不是使用进位,而是从101减基数标志102(0×66)是最后的数据库的进位中是没有0的,0标示数据结束。虽然现在该规则已经废除,但是为了兼容,还是保留。现在oracle通过计算长度来知道数据的结束。
存储是基于矢量对照语法的。从左边开始,比较数据的大小直到:一个部分不同,在这种情况下,最低的字节决定最小数字一个数据已经完成,在这种情况下,这个是两个数字中的最小的。
所有的数据都比较完成,在这种情况下,两个数字相等负数从101开始存储,因此比较下面的数字:4=<193,5>,3=<193,4>比较这些字节,+4大于+3.负数-4和-3.指数必须是62,如果值不是从101开始,则可能-4=<62,5>并且-3=<62,4>,这个时候,-4比 -3大,显然是错误的。但是从101开始以后,数字就变成了-4=<62,97>并且-3=<62,98>.现在-3是比-4大的。
字节102附加在负数的后面,保证他们排序的正确性。比较数字-100<61,100,102>和-115< 61,100,86,102>如果102不在这里,那么<61,100>和<61,100,86>将得到错误的结果,- 100比-115小。
正数的例子:因为数字是基于100的,因此最大的数字是99.指数从-65到62,因此,oracle的number的范围为:1*100(-65)=1*10(-120)到99*100(62)+99*100(61)…… 无限接近1*10^(126)
但是,因为最大的精度是38,oracle将对超出精度的数据进行round操作。如果数字的字节数超过21,oracle就会报溢出16进制也包括在这里面,因为在块dump中是一样的表现的要注意第二个字节是如何增加和减少的,数字是基于100的。