binary_float_nan和binary_double_nan 本帖最后由 BOBO12082119 于 2010-12-28 11:49:46 编辑 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 scott@YPCOST> insert into binary_test( 2 bin_float,bin_double) 3 values(39.5f,15.7d) 4 /已创建 1 行。scott@YPCOST> ed已写入 file afiedt.buf 1 insert into binary_test(bin_float,bin_double) 2* values (binary_float_infinity,binary_double_infinity);scott@YPCOST> /values (binary_float_infinity,binary_double_infinity); *第 2 行出现错误:ORA-00911: 无效字符--解释下为什么上面的语句会报错 因为是通过ed进行编辑的 然后通过回车符进行执行--最后一个;就是多余的了scott@YPCOST> ed已写入 file afiedt.buf 1 insert into binary_test(bin_float,bin_double) 2* values (binary_float_infinity,binary_double_infinity)scott@YPCOST> /已创建 1 行。--例如上面把;去掉就正常了scott@YPCOST> ed\scott@YPCOST> ed已写入 file afiedt.buf 1* select * from binary_test;scott@YPCOST> /select * from binary_test; *第 1 行出现错误:ORA-00911: 无效字符--这个也是同样的道理--而下面的语句是直接写的语句(没有通过ed进行编辑) 用;结束 然后执行scott@YPCOST> select * from binary_test; BIN_FLOAT BIN_DOUBLE---------- ---------- 3.95E+001 1.57E+001 Inf Inf binary_float_nan 表示不是一个二进制浮点数,当然就不是一个binary_float类型binary_double_nan 表示不是一个二进制双精度浮点数,当然就不是一个binary_double类型既然不是binary_float和binary_double类型,就不要向此类型的列中插入,报not a number是自然的。binary_float_infinity,binary_double_infinity,它是这个类型自然是没有问题的。 --你没理解我的意思,首先我的操作没有错误!嘿嘿--我是想知道,为什么我添加到表中的两条数据怎么查不出来?--我知道他两binary_float_nan,binary_double_nan是非binary_float和binary_double的数字,但是明明另外--还有一条数据的,怎么那条数据也不会显示出来呢?--而我是通过PL/SQL Developer编辑的,没用到ed命令在notepad里面编辑。 SQL> select count(*) from test_binary; select count(*) from test_binary ORA-00942: 表或视图不存在 SQL> select count(*) from binary_test; COUNT(*)---------- 3 SQL> select * from binary_test where rownum<=1; BIN_FLOAT BIN_DOUBLE---------- ---------- 39.5 15.7 SQL> select * from binary_test where rownum<=2; BIN_FLOAT BIN_DOUBLE---------- ---------- 39.5 15.7 1E126 1E126 SQL> select * from binary_test where rownum<=3; select * from binary_test where rownum<=3 ORA-01722: invalid number SQL> SQL> select * from binary_test t where t.bin_float !=binary_float_nan; BIN_FLOAT BIN_DOUBLE---------- ---------- 39.5 15.7 1E126 1E126 SQL> --谢谢各位的积极参与SQL> select to_char(bin_float) cl,to_char(bin_double) c2 from binary_test where rownum<=3; CL C2---------------------------------------- ----------------------------------------Nan Nan3.61199989E+001 5.6415449999999998E+002 --为何执行这句话的时候,什么也查不出来呢?是第三条数据(非数)影响到了整个查询吗?SQL> select * from binary_test where rownum<=3; select * from binary_test where rownum<=3 ORA-01722: invalid number 没用过这类型.貌似nan的数据没法正常读取.所以你取3条的时候就不成. --也就是说nan影响到了整个查询了!--那可不可一得出这样的结论呢?--当表里面有一个binary_float或binary_double类型列时,给其赋值nan,将会影响到所有的查询操作? --也就是说nan影响到了整个查询了! --那可不可一得出这样的结论呢? --当表里面有一个binary_float或binary_double类型列时,给其赋值nan--将会影响到所有关于此列的select * 或者select a.*的查询操作? binary_float_nan,binary_double_nan 在数据里存储的是IS NaN ,IS INF不要用 PL/SQL Developer 作此实验,在plsql下不支持数据和nan同时显示,可以用 SQL*Plus,其实就和 IS NULL 一样。 NULL 用于在数据库的所有数据类型的列中存储“不知道”,然后用 IS NULL 来判断。现在 NaN用于在 BINARY_DOUBL/BINARY_FLOAT 浮点类型的列中存储“不是数字”和“无限数字”,然后用 IS NaN或者是is inf具体测试如下SQL> create table binary_test 2 (bin_float binary_float, 3 bin_double binary_double);表已创建。SQL> insert into binary_test (bin_float, bin_double) values (39.5f, 15.7d);已创建 1 行。SQL> commit;提交完成。SQL> insert into binary_test(bin_float,bin_double) 2 values(binary_float_infinity,binary_double_infinity);已创建 1 行。SQL> commit;提交完成。SQL> insert into binary_test(bin_float,bin_double) 2 values(binary_float_nan,binary_double_nan);已创建 1 行。SQL> commit;提交完成。SQL> select * from binary_test; BIN_FLOAT BIN_DOUBLE---------- ---------- 3.95E+001 1.57E+001 Inf Inf Nan NanSQL> select * from binary_test where bin_float is NAN; BIN_FLOAT BIN_DOUBLE---------- ---------- Nan NanSQL> SQL> create table binary_test 2 (bin_float binary_float, 3 bin_double binary_double) 4 / Table created SQL> SQL> insert into binary_test( 2 bin_float,bin_double) 3 values(39.5f,15.7d) 4 / 1 row inserted SQL> SQL> insert into binary_test(bin_float,bin_double) 2 values(binary_float_infinity,binary_double_infinity); 1 row inserted SQL> commit 2 / Commit complete SQL> select * from binary_test 2 / BIN_FLOAT BIN_DOUBLE---------- ---------- 39.5 15.7 1E126 1E126 SQL> SQL> insert into binary_test(bin_float,bin_double) 2 values(binary_float_nan,binary_double_nan) 3 / 1 row inserted SQL> commit 2 / Commit complete SQL> select * from binary_test 2 / select * from binary_test ORA-01722: 无效数字 SQL> select count(*) from binary_test 2 / COUNT(*)---------- 3 SQL> --sqlplus 下则可以 是的如楼上说 的scott@ORCL> select * from binary_test 2 / BIN_FLOAT BIN_DOUBLE---------- ---------- 3.95E+001 1.57E+001 Inf Inf Nan Nan 还是PL/SQL Developer 不支持 --原来是pl/sql developer的问题! 帮我看看这条简单的查询语句 有关结果集行号的问题 不能用EXP导出dmp文件 关于Teradata数据库时间转换问题 请教一个权限设置的问题:为什么存储过程中不能访问另一个用户的表? 请问oracle数据库中哪张表里记录数据库所有表的表名,那张表记录各个表的主键? /控制面板/服务/的启动问题(ORACLE)在线等待。。。 那位帮主知道oracle中index_ffs的用法? 快要疯了!!帮忙啊 Oracle根据IN字句条件查询显示结果 怎样 来自不同用户下的要有关系表来构建视图??? 弱弱的问一下 oracle能不能在查询出来的同时,对查询结果做计算?
scott@YPCOST> insert into binary_test(
2 bin_float,bin_double)
3 values(39.5f,15.7d)
4 /已创建 1 行。scott@YPCOST> ed
已写入 file afiedt.buf 1 insert into binary_test(bin_float,bin_double)
2* values (binary_float_infinity,binary_double_infinity);
scott@YPCOST> /
values (binary_float_infinity,binary_double_infinity);
*
第 2 行出现错误:
ORA-00911: 无效字符--解释下为什么上面的语句会报错 因为是通过ed进行编辑的 然后通过回车符进行执行
--最后一个;就是多余的了
scott@YPCOST> ed
已写入 file afiedt.buf 1 insert into binary_test(bin_float,bin_double)
2* values (binary_float_infinity,binary_double_infinity)
scott@YPCOST> /已创建 1 行。--例如上面把;去掉就正常了
scott@YPCOST> ed\scott@YPCOST> ed
已写入 file afiedt.buf 1* select * from binary_test;
scott@YPCOST> /
select * from binary_test;
*
第 1 行出现错误:
ORA-00911: 无效字符--这个也是同样的道理
--而下面的语句是直接写的语句(没有通过ed进行编辑) 用;结束 然后执行
scott@YPCOST> select * from binary_test; BIN_FLOAT BIN_DOUBLE
---------- ----------
3.95E+001 1.57E+001
Inf Inf
binary_double_nan 表示不是一个二进制双精度浮点数,当然就不是一个binary_double类型
既然不是binary_float和binary_double类型,就不要向此类型的列中插入,
报not a number是自然的。
binary_float_infinity,binary_double_infinity,它是这个类型自然是没有问题的。
--你没理解我的意思,首先我的操作没有错误!嘿嘿
--我是想知道,为什么我添加到表中的两条数据怎么查不出来?
--我知道他两binary_float_nan,binary_double_nan是非binary_float和binary_double的数字,但是明明另外--还有一条数据的,怎么那条数据也不会显示出来呢?
--而我是通过PL/SQL Developer编辑的,没用到ed命令在notepad里面编辑。
select count(*) from test_binary
ORA-00942: 表或视图不存在
SQL> select count(*) from binary_test;
COUNT(*)
----------
3
SQL> select * from binary_test where rownum<=1;
BIN_FLOAT BIN_DOUBLE
---------- ----------
39.5 15.7
SQL> select * from binary_test where rownum<=2;
BIN_FLOAT BIN_DOUBLE
---------- ----------
39.5 15.7
1E126 1E126
SQL> select * from binary_test where rownum<=3;
select * from binary_test where rownum<=3
ORA-01722: invalid number
SQL>
BIN_FLOAT BIN_DOUBLE
---------- ----------
39.5 15.7
1E126 1E126
SQL>
--谢谢各位的积极参与
SQL> select to_char(bin_float) cl,to_char(bin_double) c2 from binary_test where rownum<=3;
CL C2
---------------------------------------- ----------------------------------------
Nan Nan
3.61199989E+001 5.6415449999999998E+002
--为何执行这句话的时候,什么也查不出来呢?是第三条数据(非数)影响到了整个查询吗?
SQL> select * from binary_test where rownum<=3;
select * from binary_test where rownum<=3
ORA-01722: invalid number
--也就是说nan影响到了整个查询了!
--那可不可一得出这样的结论呢?
--当表里面有一个binary_float或binary_double类型列时,给其赋值nan,将会影响到所有的查询操作?
--也就是说nan影响到了整个查询了!
--那可不可一得出这样的结论呢?
--当表里面有一个binary_float或binary_double类型列时,给其赋值nan
--将会影响到所有关于此列的select * 或者select a.*的查询操作?
不要用 PL/SQL Developer 作此实验,在plsql下不支持数据和nan同时显示,
可以用 SQL*Plus,其实就和 IS NULL 一样。 NULL 用于在数据库
的所有数据类型的列中存储“不知道”,然后用 IS NULL 来判断。
现在 NaN用于在 BINARY_DOUBL/BINARY_FLOAT 浮点类型
的列中存储“不是数字”和“无限数字”,然后用 IS NaN或者是is inf
具体测试如下SQL> create table binary_test
2 (bin_float binary_float,
3 bin_double binary_double);表已创建。SQL> insert into binary_test (bin_float, bin_double) values (39.5f, 15.7d);已创建 1 行。SQL> commit;提交完成。SQL> insert into binary_test(bin_float,bin_double)
2 values(binary_float_infinity,binary_double_infinity);已创建 1 行。SQL> commit;提交完成。SQL> insert into binary_test(bin_float,bin_double)
2 values(binary_float_nan,binary_double_nan);已创建 1 行。SQL> commit;提交完成。SQL> select * from binary_test; BIN_FLOAT BIN_DOUBLE
---------- ----------
3.95E+001 1.57E+001
Inf Inf
Nan NanSQL> select * from binary_test where bin_float is NAN; BIN_FLOAT BIN_DOUBLE
---------- ----------
Nan NanSQL>
2 (bin_float binary_float,
3 bin_double binary_double)
4 /
Table created
SQL>
SQL> insert into binary_test(
2 bin_float,bin_double)
3 values(39.5f,15.7d)
4 /
1 row inserted
SQL>
SQL> insert into binary_test(bin_float,bin_double)
2 values(binary_float_infinity,binary_double_infinity);
1 row inserted
SQL> commit
2 /
Commit complete
SQL> select * from binary_test
2 /
BIN_FLOAT BIN_DOUBLE
---------- ----------
39.5 15.7
1E126 1E126
SQL>
SQL> insert into binary_test(bin_float,bin_double)
2 values(binary_float_nan,binary_double_nan)
3 /
1 row inserted
SQL> commit
2 /
Commit complete
SQL> select * from binary_test
2 /
select * from binary_test
ORA-01722: 无效数字
SQL> select count(*) from binary_test
2 /
COUNT(*)
----------
3
SQL> --sqlplus 下则可以 是的如楼上说 的
scott@ORCL> select * from binary_test
2 / BIN_FLOAT BIN_DOUBLE
---------- ----------
3.95E+001 1.57E+001
Inf Inf
Nan Nan
--原来是pl/sql developer的问题!