特别是number数据类型,我看好多人喜欢用,甚至整型都要用个number(10,0)来表示,给我的感觉,number是一个对象,它能比内部数据类型,比如int,float的速度还要快?
我想知道number数据类型的优势在哪里,而内部数据类型,比如int,float,real等的劣势又在哪里呢?注:我是oracle新手,以前都是用MSSQLServer的,MSSQLServer里面的数据类型,基本上都是内部类型(CPU可识别的),除了image这些特殊数据类型和numeric等之外。numeric在我看来也是一个对象,不能直接参与计算的,所以我都不用,记得有一次,我用ADO来读取numeric数据,结果是返回一个字符串的,难道是用字符串保存的numeric。听说oracle的number是按10进制保存的,那么它也是一个对象,无法直接参与计算,那么它的效率又是如何得到保障的呢?我能想到的,需要精确的确定小数位数的,就是在计算钱的时候(而且MSSQLServer里面,已经有一个货币类型数据了),可是大部分情况下,我认为并不需要精确小数的位数,比如1.2用1.199999来表示,是可以接受的。

解决方案 »

  1.   

    number是按照实际需要进行存储的,并不会多占用空间,所以,没有必要使用int之类的类型。
    oracle自己也是推荐使用number类型。
      

  2.   

    IEEE的float double等数据,是可以直接取出来参与计算的,number不行吧?
    我用TTClasses对TimesTen进行操作时,如果要做参数绑定,那么对应于number(5,0)的居然是double型的,你可以试试。
    我想用OCCI也会这样。oracle推荐使用什么我不太清楚,但光从效率上来说,好像oracle也说float double integer等比number快,而且占用的存储空间还少一些,这是oracle sql developer里面的帮助:However, while NUMBER uses decimal precision, BINARY_FLOAT and BINARY_DOUBLE use binary precision. This enables faster arithmetic calculations and usually reduces storage requirements.The BINARY_FLOAT and BINARY_DOUBLE data types store floating-point data in the 32-bit IEEE 754 format and the double precision 64-bit IEEE 754 format respectively. Compared to the Oracle NUMBER data type, arithmetic operations on floating-point data are usually faster for BINARY_FLOAT and BINARY_DOUBLE. Also, high-precision values require less space when stored as BINARY_FLOAT and BINARY_DOUBLE
      

  3.   

    我看到的唯一的number的优点就是:Use the NUMBER data type to store integers and real numbers in a fixed-point or floating-point format. Numbers using this data type are guaranteed to be portable among different Oracle Database platforms. 所以我发此贴,想了解一下,到底有没有必要使用number,在什么条件下使用number,在什么情况下使用integer float等。
      

  4.   

    如果是数值型的整数还不如用PLS_INTEGER和BINARY_INTEGER,
    PLS_INTEGER和NUMBER比较起来,其优点是:
    1).占有较少的存储空间;
    2).可以直接进行算术运算(在NUMBER上不能直接进行算术运算,如果要计算,NUMBER必须先被转换成二进制)。所以在进行算术的时候PLS_INTEGER比NUMBER和BINARY_INTEGER快一些。PLS_INTEGER可以存储一个有符号的整形值,其精度范围和BINARY_INTEGER一样,是:-2^31~2^31。
    而PLS_INTEGER和BINARY_INTEGER区别是: 
    PLS_INTEGER进行的运算发生溢出的时候,会触发异常。但是当BINARY_INTEGER运算发生溢出时,如果可以指派给一个NUMBER变量(没有超出NUMBER的精度范围)的话就不会触发异常。
      

  5.   

    BINARY_INTEGER不能直接自述运算吗?
      

  6.   

    太钻牛角尖。目前系统已经很快了,如果你的项目非要考虑优化是否使用INT 还是NUMBER,那么你的项目在设计上就上应该考虑优化了。
      

  7.   

    什么时候我还是做过实验吧,比如进行10万次的number(10, 1)加运行,和进行10万次的float加运行,给我的感觉恐怕用时会差倍数关系(因为对于number的加减乘除,都要先经过转换),那么就不是钻牛角尖了,更不是“太”钻牛角尖了!听说oracle的速度非常的快,我想oracle的设计都如果不“太钻牛角尖”的话,恐怕达不到当今的速度吧!
      

  8.   

    我用number的原因是因为它写起来比较顺手