分类: 数据库开发技术
2011-09-19 15:20:08
引子:
前几天有人问到:同一个QAPI中的同一个参数,为什么有的定义成Binary(4),而有的定义成Integer(10),并且二者皆出自IBM 官方的red book。IBM应该不会出现乌龙吧?
比如说下面的QAPI:
Create User Space (QUSCRTUS) API
Required Parameter Group:
1 Qualified user space name Input Char(20)
2 Extended attribute Input Char(10)
3 Initial size Input Binary(4)
4 Initial value Input Char(1)
5 Public authority Input Char(10)
6 Text description Input Char(50)
另一种定义版本:
Create User Space (QUSCRTUS) API
1 Qualified user space name Input Char(20)
2 Extended attribute Input Char(10)
3 Initial size Input Integer(10)
4 Initial value Input Char(1)
5 Public authority Input Char(10)
6 Text description Input Char(50)
我非常遗憾的告诉大家,IBM没有犯这么低级的错误,实际上二者是等价的。考虑到可能像我一样的新手存在疑惑,下面就解释一下二者为什么等价。
首先说明一下各种数据类型,不同的数据长度所占的字节数(参考red book):
数据类型 字节与位数的关系 取值范围
B(Binary): 2bytes能表示4位数 -9999 ~ 9999
4bytes能表示9位数 -999 999 999 ~ 999 999 999
I(Integer): 1bytes能表示3位数 -128 ~ 127
2bytes能表示5位数 -32768 ~ 32767
4bytes能表示10位数 -2147483648 ~ 2147483647
8bytes能表示20位数
U(Unsigned): 1bytes能表示3位数 0 ~ 255
2bytes能表示5位数 0 ~ 65535
4bytes能表示10位数 0 ~ 4294967295
8bytes能表示20位数 0 ~ 18446744073709551615
P(Packed): 1bytes能表示1位数 -9~9
2bytes能表示3位数 -999 ~ 999
3bytes能表示5位数 -99999 ~ 99999-
4bytes能表示7位数 -9999999 ~ 9999999
…………
S(Zone): 1bytes能表示1位数 -9 ~ 9
2bytes能表示2位数 -99 ~ 99
3bytes能表示3位数 -999 ~ 999
4bytes能表示4位数 -9999 ~ 9999
…………
之所以说B(4)=I(10)是等价的,主要从两方面考虑,各自所占字节数和各自的取值范围。
1) 所占字节:B(4)=4bytes I(10)=4bytes 二者相等。
疑问:其他的数据类型也有占4bytes的[U(10)、P(7)、S(4)],为什么不能和B(4)等价呢?接着往下看:
2 ) 取值范围:B(4): -999 999 999 ~ 999 999 999
I(10): -2147483648 ~ 2147483647
I(10)的取值范围完全包含B(4)的取值范围,从这两点上看,B(4)和I(10)是等价的。
下面再回答上面的疑问:
B(4)的取值范围并不能完全包含于U(10)、P(7)、S(4),总有一部分数值无法取得,所以B(4)不能与U(10)、P(7)、S(4)等价
注释1:
不过以Initial size Input Integer(10)这个参数为例,B(4)实际上又等价与U(10),因为Initial size这个参数必须是大于0的(The initial size of the user space being created. This value must be from 1 byte to 16, 776, 704 bytes),B(4)的取值范围实际上是:1 ~ 999 999 999,而U(10)的取值范围:0 ~ 4294967295,远远超过999 999 999了,所以B(4)与I(10)也是等价的。
这个例子就是想告诉大家,QAPI的参数定义是很灵活的东西,不一定非得按部就班,熟悉个中缘由之后,自己可以根据实际需要,灵活的定义数据类型。
注释2:
有同学问,那B(8)等价于I(20)咯??
答案:NO!!
因为二进制数据仅有B(2) B(4)两种,不存在B(1) B(3) B(8)等。系统会根据数据的位数自动分配2byte(4位数)和4bytes(5-9位数)。过9位数的话,系统会反白提示错误。