Oracle的Number类型
这两天因为工作需要学习了一下Oracle的Number数据类型,现在将自己写的部分文档贴上来,
一、Oracle的Number数据类型
在Oracle中Number类型可以用来存储0,正负定点或者浮点数,可表示的数据范围在
1.0 * 10(-130) —— 9.9...9 * 10(125) {38个9后边带88个0}
的数字,当Oracle中的数学表达式的值>=1.0*10(126)时,Oracle就会报错。
Number的数据声明如下:
表示 作用 说明
Number(p, s) 声明一个定点数 p(precision)为精度,s(scale)表示小数点右边的数字个数,精度最大值为38,scale的取值范围为-84到127
Number(p) 声明一个整数 相当于Number(p, 0)
Number 声明一个浮点数 其精度为38,要注意的是scale的值没有应用,也就是说scale的指不能简单的理解为0,或者其他的数。
定点数的精度(p)和刻度(s)遵循以下规则:
当一个数的整数部分的长度 > p-s 时,Oracle就会报错
当一个数的小数部分的长度 > s 时,Oracle就会舍入。
当s(scale)为负数时,Oracle就对小数点左边的s个数字进行舍入。
当s > p 时, p表示小数点后第s位向左最多可以有多少位数字,如果大于p则Oracle报错,小数点后s位向右的数字被舍入。
在Oracle中可以指定浮点数,因为小数点可以在这个数的任何位置,所以其scale就没有意义了。
Oracle中同时支持ANSI的Float类型,其语法如下:
语法 功能 说明
Float 指定一个浮点数 其10进制精度为38,2进制精度为126
Float(b) 指定一个2进制精度为b(1~126)的浮点数 其二进制精度(b)和十进制精度(p)的转换关系是:
p = b * 0.30103
二、Oracle对数据类型的处理
Oracle的数据类型分为内部数据类型和外部数据类型两类,内部数据类型是Oracle内部运算时的数据类型,外部数据类型时与主机相关的应用中需要处理的数据类型。当使用OCI时,内部数据和外部数据之间的转换是透明的,即当OCI应用调用OCIDefineByPos()函数是只需要指定dty参数和valuep参数即可获得相应数据类型的数据,其中dty是数据类型,valuep是一个指向可以存贮该类型数据的指针。
继续上边提到的Number类型,所有的数字型数据在Oracle服务器中都是以这种个是来存储的,Oralce将Number类型以最长为21字节的字符序列进行存储(Null用0xFF表示)。其中第一个字节是一个描述符,它的最高位表示该数的符号(正数的时候被置位),该字节的其余位表示该数的指数e,对于正数指数e等于该数采用100进制科学计数法时的指数p再加上64,对于负数指数e等于63减去该数采用100进制科学计数法时的指数p。该存储格式中的其它字节以百进制方式存储数据,这些字节通常被称为尾数,每一个字节都表示100进制中的一位,这样,每两个十进制数字就可以用一个字节来表示,当该数是一个正数的时候,尾数字节中的数值为对应的百位数加1,这样就避免了出现0x00;而该数为负数时,尾数字节的值为101减去对应的百位数,同时在尾部添加一个值为102的填充字节(如果该数的百进制位数大于等于20位则不添加)。下面通过对数字N=(-122.022)的变换过程来说明这种存储格式的获得步骤:
将数字 N 以百进制科学计数法表示,形如:-0.01220220*100^2
先处理N的尾数字节,因为N为负数,所以N的百进制表示的各位数字需要按上述规则转换进行转换,所以有:
01 22 02 20 -> 100 79 99 81 102 = 0x64 0x4F 0x63 0x51 0x66
计算N的指数e,e = 63-p = 63-2 = 61 = 0x3D
生成指示字节,因为N<0,所以指示字节= e = 0x3D
所以-122.022所对应的字节序列为:0x3D 0x64 0x4F 0x63 0x51 0x66
图示:
数字 指示字节 数据字节 终止字节 VarNum长度
0 128(0x80) n/a n/a 1
5 193(0xC1) 6(0x6) n/a 2
2767 194(0xC2) 28 68(0x4A 0x22) n/a 3
-2767 61(0x3D) 74 34 (0x4A 0x22) 102(0x66) 4
-15837.23434 60(0x3C) 100 43 64 78 58 61
(0x64 0x2B 0x40 0x4E 0x3A 0x3D) 102(0x66) 8
这两天因为工作需要学习了一下Oracle的Number数据类型,现在将自己写的部分文档贴上来,
一、Oracle的Number数据类型
在Oracle中Number类型可以用来存储0,正负定点或者浮点数,可表示的数据范围在
1.0 * 10(-130) —— 9.9...9 * 10(125) {38个9后边带88个0}
的数字,当Oracle中的数学表达式的值>=1.0*10(126)时,Oracle就会报错。
Number的数据声明如下:
表示 作用 说明
Number(p, s) 声明一个定点数 p(precision)为精度,s(scale)表示小数点右边的数字个数,精度最大值为38,scale的取值范围为-84到127
Number(p) 声明一个整数 相当于Number(p, 0)
Number 声明一个浮点数 其精度为38,要注意的是scale的值没有应用,也就是说scale的指不能简单的理解为0,或者其他的数。
定点数的精度(p)和刻度(s)遵循以下规则:
当一个数的整数部分的长度 > p-s 时,Oracle就会报错
当一个数的小数部分的长度 > s 时,Oracle就会舍入。
当s(scale)为负数时,Oracle就对小数点左边的s个数字进行舍入。
当s > p 时, p表示小数点后第s位向左最多可以有多少位数字,如果大于p则Oracle报错,小数点后s位向右的数字被舍入。
在Oracle中可以指定浮点数,因为小数点可以在这个数的任何位置,所以其scale就没有意义了。
Oracle中同时支持ANSI的Float类型,其语法如下:
语法 功能 说明
Float 指定一个浮点数 其10进制精度为38,2进制精度为126
Float(b) 指定一个2进制精度为b(1~126)的浮点数 其二进制精度(b)和十进制精度(p)的转换关系是:
p = b * 0.30103
二、Oracle对数据类型的处理
Oracle的数据类型分为内部数据类型和外部数据类型两类,内部数据类型是Oracle内部运算时的数据类型,外部数据类型时与主机相关的应用中需要处理的数据类型。当使用OCI时,内部数据和外部数据之间的转换是透明的,即当OCI应用调用OCIDefineByPos()函数是只需要指定dty参数和valuep参数即可获得相应数据类型的数据,其中dty是数据类型,valuep是一个指向可以存贮该类型数据的指针。
继续上边提到的Number类型,所有的数字型数据在Oracle服务器中都是以这种个是来存储的,Oralce将Number类型以最长为21字节的字符序列进行存储(Null用0xFF表示)。其中第一个字节是一个描述符,它的最高位表示该数的符号(正数的时候被置位),该字节的其余位表示该数的指数e,对于正数指数e等于该数采用100进制科学计数法时的指数p再加上64,对于负数指数e等于63减去该数采用100进制科学计数法时的指数p。该存储格式中的其它字节以百进制方式存储数据,这些字节通常被称为尾数,每一个字节都表示100进制中的一位,这样,每两个十进制数字就可以用一个字节来表示,当该数是一个正数的时候,尾数字节中的数值为对应的百位数加1,这样就避免了出现0x00;而该数为负数时,尾数字节的值为101减去对应的百位数,同时在尾部添加一个值为102的填充字节(如果该数的百进制位数大于等于20位则不添加)。下面通过对数字N=(-122.022)的变换过程来说明这种存储格式的获得步骤:
将数字 N 以百进制科学计数法表示,形如:-0.01220220*100^2
先处理N的尾数字节,因为N为负数,所以N的百进制表示的各位数字需要按上述规则转换进行转换,所以有:
01 22 02 20 -> 100 79 99 81 102 = 0x64 0x4F 0x63 0x51 0x66
计算N的指数e,e = 63-p = 63-2 = 61 = 0x3D
生成指示字节,因为N<0,所以指示字节= e = 0x3D
所以-122.022所对应的字节序列为:0x3D 0x64 0x4F 0x63 0x51 0x66
图示:
数字 指示字节 数据字节 终止字节 VarNum长度
0 128(0x80) n/a n/a 1
5 193(0xC1) 6(0x6) n/a 2
2767 194(0xC2) 28 68(0x4A 0x22) n/a 3
-2767 61(0x3D) 74 34 (0x4A 0x22) 102(0x66) 4
-15837.23434 60(0x3C) 100 43 64 78 58 61
(0x64 0x2B 0x40 0x4E 0x3A 0x3D) 102(0x66) 8