tak*_*eek 5 sql oracle oracle10g
Oracle 10g中的FLOAT数据类型是什么?它与NUMBER的关系如何?
我可以在Oracle文档中找到FLOAT的唯一参考是在本页的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本身不提供的行为?
10g中的文档有点不清楚.它从11.1开始有了很大的改进:
http://docs.oracle.com/cd/B28359_01/server.111/b28286/sql_elements001.htm#sthref94
总之,FLOAT是一样的NUMBER,有两点不同
FLOAT 无法指定比例FLOAT,精度以二进制位给出,以NUMBER十进制数字表示,因此FLOAT(126)意味着126位精度,NUMBER(38)意味着精度为38位十进制数字编辑
一些例子表明a 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
Run Code Online (Sandbox Code Playgroud)
但要小心,从Float的精度位到Number的十进制数字的转换因子不是3,而是大约3.32.确切的数字 = ceil(bits/log(2,10).