FLOAT如何映射/与Oracle 10g中的NUMBER相关?

时间:2013-07-02 01:00:06

标签: sql oracle oracle10g

Oracle 10g中的FLOAT数据类型是什么?它与NUMBER的关系如何?

我可以找到Oracle文档中飘起了唯一的参考是在本页面BINARY_DOUBLE部分:http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements001.htm#i140621这似乎表明,它存储一个浮点数,并允许您指定的精度位,但它没有引用NUMBER类型。 11g文档根本没有提到FLOAT。

“专家Oracle数据库架构:Oracle数据库9i,10g和11g编程技术与解决方案,第二版”一书中说:

  

除了NUMBER,BINARY_FLOAT和BINARY_DOUBLE类型之外,Oracle在语法上支持以下数值数据类型:

     

当我说“语法支持”时,我的意思是CREATE语句可能会使用这些数据类型,但在封面下它们都是NUMBER类型。 ......

     
      
  • FLOAT(p):映射到NUMBER类型。
  •   

我不明白的是 它映射到NUMBER。

NUMBER(p)允许我指定精度但是比例默认为0.似乎FLOAT(p)映射到NUMBER(decimal p, *),即固定精度但是可变比例,这不是就我所知,NUMBER类型允许。

那么,FLOAT不仅仅是一个别名,而且还提供了NUMBER本身不提供的行为?

1 个答案:

答案 0 :(得分:7)

10g中的文档有点不清楚。从11.1开始,它已经有了很大的改进:

http://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements001.htm#sthref94

总之,FLOATNUMBER相同,但存在两个差异

  1. FLOAT无法指定比例
  2. FLOAT中,精度以二进制位给出,NUMBER以十进制数字表示,因此FLOAT(126)表示126位精度,NUMBER(38)表示38位十进制数字精度
  3. 修改 一些示例显示FLOAT只是伪装成NUMBER

    CREATE TABLE t (
      n1 NUMBER(*,1),  f1 FLOAT(1), f2 FLOAT(2), f3 FLOAT(3),
      n2 NUMBER(*,2),  f4 FLOAT(4), f5 FLOAT(5), f6 FLOAT(6)
    );
    INSERT INTO t VALUES (1/3, 1/3, 1/3, 1/3, 1/3, 1/3, 1/3, 1/3);
    
    SELECT n1, f1, f2, f3 FROM t;
      0.3 0.3 0.3 0.3
    
    SELECT DUMP(n1), DUMP(f1), DUMP(f2), DUMP(f3) FROM t;
      Typ=2 Len=2: 192,31
      Typ=2 Len=2: 192,31
      Typ=2 Len=2: 192,31
      Typ=2 Len=2: 192,31
    
    SELECT n2, f4, f5, f6 FROM t;
      0.33 0.33 0.33 0.33
    
    SELECT DUMP(n2), DUMP(f4), DUMP(f5), DUMP(f6) FROM t;
      Typ=2 Len=2: 192,34
      Typ=2 Len=2: 192,34
      Typ=2 Len=2: 192,34
      Typ=2 Len=2: 192,34
    

    但要小心,从Float的精度位到Number的十进制数字的转换因子不是3,而是大约3.32。确切地说,位数 = ceil( / log(2,10)。