Chinaunix首页 | 论坛 | 博客
  • 博客访问: 48547
  • 博文数量: 10
  • 博客积分: 557
  • 博客等级: 下士
  • 技术积分: 250
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-25 20:13
文章分类

全部博文(10)

文章存档

2011年(9)

2010年(1)

分类: 数据库开发技术

2011-09-19 15:20:08

引子:

前几天有人问到:同一个QAPI中的同一个参数,为什么有的定义成Binary(4),而有的定义成Integer(10),并且二者皆出自IBM 官方的red bookIBM应该不会出现乌龙吧?

比如说下面的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)等。系统会根据数据的位数自动分配2byte4位数)和4bytes5-9位数)。过9位数的话,系统会反白提示错误。

 

阅读(2084) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~