查看: 15520|回复: 20

[讨论] null的类型是什么??

[复制链接]
求职 : 数据库开发
论坛徽章:
29
ITPUB学员
日期:2009-10-14 18:49:45至尊黑钻
日期:2015-12-31 11:11:56数据库板块每日发贴之星
日期:2009-10-22 01:01:02优秀写手
日期:2014-04-30 06:00:17ITPUB8周年纪念徽章
日期:2009-10-09 21:30:10秀才
日期:2017-05-17 11:39:09马上有车
日期:2014-10-09 10:14:53马上有钱
日期:2014-02-18 16:43:09路虎
日期:2013-10-15 15:38:59林肯
日期:2013-09-12 15:57:33
跳转到指定楼层
1#
发表于 2010-7-23 10:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
刚才同事来问我SQL里有个字段要插空数据。。是不是无论什么字段类型写null。。。于是我有了个疑问。null也应该算是一条数据吧,那它的数据类型是啥?object这样的类型?
论坛徽章:
1
2010新春纪念徽章
日期:2010-03-01 11:06:24
2#
发表于 2010-7-23 10:05 | 只看该作者
null代表不可知

世界性难题,哈哈

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
3#
发表于 2010-7-23 11:12 | 只看该作者
NULL没有类型,NULL的类型可以这样说:如果是字面量NULL则没有类型,如果是具有类型的NULL,比如一个表的a字段类型是NUMBER,里面有个NULL则这个NULL就是NUMBER类型。所以NULL类型具有自适应性。如果NULL有类型,为什么PL/SQL动态SQL绑定变量不能传入字面量NULL呢,TO_CHAR(NULL)就可以,报错也是报必须是SQL类型的错误。

研究他的类型干嘛?没有什么意义!yangtingkun好像研究过NULL的类型,但是我认为那是错的,因为DECODE函数比较特殊而已

使用道具 举报

回复
求职 : 数据库开发
论坛徽章:
29
ITPUB学员
日期:2009-10-14 18:49:45至尊黑钻
日期:2015-12-31 11:11:56数据库板块每日发贴之星
日期:2009-10-22 01:01:02优秀写手
日期:2014-04-30 06:00:17ITPUB8周年纪念徽章
日期:2009-10-09 21:30:10秀才
日期:2017-05-17 11:39:09马上有车
日期:2014-10-09 10:14:53马上有钱
日期:2014-02-18 16:43:09路虎
日期:2013-10-15 15:38:59林肯
日期:2013-09-12 15:57:33
4#
 楼主| 发表于 2010-7-23 11:31 | 只看该作者
原帖由 dingjun123 于 2010-7-23 11:12 发表
NULL没有类型,NULL的类型可以这样说:如果是字面量NULL则没有类型,如果是具有类型的NULL,比如一个表的a字段类型是NUMBER,里面有个NULL则这个NULL就是NUMBER类型。所以NULL类型具有自适应性。如果NULL有类型,为什么PL/SQL动态SQL绑定变量不能传入字面量NULL呢,TO_CHAR(NULL)就可以,报错也是报必须是SQL类型的错误。

研究他的类型干嘛?没有什么意义!yangtingkun好像研究过NULL的类型,但是我认为那是错的,因为DECODE函数比较特殊而已



我也觉得有随类型改变的想法。。。也算不上研究,因为连用什么方法去研究都想不出来,纯粹的求知欲

使用道具 举报

回复
论坛徽章:
32
奥运会纪念徽章:摔跤
日期:2012-08-23 11:03:05青年奥林匹克运动会-击剑
日期:2014-09-19 10:58:152014年世界杯参赛球队:巴西
日期:2014-07-07 12:19:232014年世界杯参赛球队: 瑞士
日期:2014-05-19 12:18:36马上有钱
日期:2014-04-08 12:12:232014年新春福章
日期:2014-04-04 14:20:47马上有钱
日期:2014-02-18 16:43:092014年新春福章
日期:2014-02-18 16:43:09红旗
日期:2014-02-14 15:15:55优秀写手
日期:2013-12-18 09:29:16
5#
发表于 2010-7-23 13:11 | 只看该作者
NULL可以是凡是可以为NULL的类型的类型

使用道具 举报

回复
论坛徽章:
32
祖国60周年纪念徽章
日期:2009-10-09 08:28:002013年新春福章
日期:2013-02-25 14:51:24迷宫蛋
日期:2013-06-28 11:09:23ITPUB季度 技术新星
日期:2013-07-30 16:04:58优秀写手
日期:2013-12-18 09:29:132014年新春福章
日期:2014-02-18 16:43:09马上有钱
日期:2014-02-18 16:43:09红孩儿
日期:2014-03-04 16:40:38美羊羊
日期:2015-02-16 16:36:28懒羊羊
日期:2015-03-04 14:52:11
6#
发表于 2010-7-23 15:41 | 只看该作者
我的理解null是一种数据存在性的判断,或者说是数据的一种状态
即数值为空(is null)或者为非空(is not null),所以谈不上什么类型不类型
就比如说有三个容器,一个是空气、一个是水、一个是真空
空气的类型是气体,水的类型是液体,那真空是什么类型呢?

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
7#
发表于 2010-7-23 16:10 | 只看该作者
原帖由 regonly1 于 2010-7-23 15:41 发表
我的理解null是一种数据存在性的判断,或者说是数据的一种状态
即数值为空(is null)或者为非空(is not null),所以谈不上什么类型不类型
就比如说有三个容器,一个是空气、一个是水、一个是真空
空气的类型是气体,水的类型是液体,那真空是什么类型呢?

不能这么说,NULL是有类型的啊,比如a varchar2(10):=null;这个null就是varchar2(10)的类型,比如select null from dual;这个literal null就是没有类型的
没有类型的在动态sql绑定变量的时候不能用的,比如
SQL> declare
  2  v_sql varchar2(100);
  3  v_cnt number(10);
  4  begin
  5   v_sql:='select count(*) from all_objects where object_name=:1';
  6   execute immediate v_sql into v_cnt using null;
  7   dbms_output.put_line(v_cnt);
  8  end;
  9  /

declare
v_sql varchar2(100);
v_cnt number(10);
begin
v_sql:='select count(*) from all_objects where object_name=:1';
execute immediate v_sql into v_cnt using null;
dbms_output.put_line(v_cnt);
end;

ORA-06550: 第 7 行, 第 43 列:
PLS-00457: 表达式必须是 SQL 类型
ORA-06550: 第 7 行, 第 2 列:
PL/SQL: Statement ignored

SQL>
SQL> declare
  2  v_sql varchar2(100);
  3  v_cnt number(10);
4  v_bind varchar2(10):=null;
  5  begin
  6   v_sql:='select count(*) from all_objects where object_name=:1';
  7   execute immediate v_sql into v_cnt using v_bind;
  8   dbms_output.put_line(v_cnt);
  9  end;
10  /
0
PL/SQL procedure successfully completed


第1个字面量null没有类型所以报错,第2个是有类型的null,或者using to_char(null)也是可以的

使用道具 举报

回复
求职 : 数据库开发
论坛徽章:
29
ITPUB学员
日期:2009-10-14 18:49:45至尊黑钻
日期:2015-12-31 11:11:56数据库板块每日发贴之星
日期:2009-10-22 01:01:02优秀写手
日期:2014-04-30 06:00:17ITPUB8周年纪念徽章
日期:2009-10-09 21:30:10秀才
日期:2017-05-17 11:39:09马上有车
日期:2014-10-09 10:14:53马上有钱
日期:2014-02-18 16:43:09路虎
日期:2013-10-15 15:38:59林肯
日期:2013-09-12 15:57:33
8#
 楼主| 发表于 2010-7-23 16:10 | 只看该作者
原帖由 regonly1 于 2010-7-23 15:41 发表
我的理解null是一种数据存在性的判断,或者说是数据的一种状态
即数值为空(is null)或者为非空(is not null),所以谈不上什么类型不类型
就比如说有三个容器,一个是空气、一个是水、一个是真空
空气的类型是气体,水的类型是液体,那真空是什么类型呢?



呵呵- -。。你让null是“未知的,不确定的数据”这个解释情何以堪那。。。我这边基本上认为NULL的类型会随着字段类型做改变了。。
关于你这个解释。。。最简单的问题是1+null = ?,如果null是不存在的意思的话,那么答案肯定1。。。如果null是未知的意思。。那么1和一个未知的数相加结果还是未知,也就是null。。

使用道具 举报

回复
论坛徽章:
1088
金色在线徽章
日期:2007-04-25 04:02:08金色在线徽章
日期:2007-06-29 04:02:43金色在线徽章
日期:2007-03-11 04:02:02在线时间
日期:2007-04-11 04:01:02在线时间
日期:2007-04-12 04:01:02在线时间
日期:2007-03-07 04:01:022008版在线时间
日期:2010-05-01 00:01:152008版在线时间
日期:2011-05-01 00:01:342008版在线时间
日期:2008-06-03 11:59:43ITPUB年度最佳技术原创精华奖
日期:2013-03-22 13:18:30
9#
发表于 2010-7-23 16:12 | 只看该作者
嘿嘿,我的测试就证明了字面量NULL无类型,其他的适应性NULL类型自适应

关于字面量NULL到底有没有类型,别管他,就认为他是无类型的,从第1个PL/SQL可以看出

使用道具 举报

回复
论坛徽章:
519
奥运会纪念徽章:垒球
日期:2008-09-15 01:28:12生肖徽章2007版:鸡
日期:2008-11-17 23:40:58生肖徽章2007版:马
日期:2008-11-18 05:09:48数据库板块每日发贴之星
日期:2008-11-29 01:01:02数据库板块每日发贴之星
日期:2008-12-05 01:01:03生肖徽章2007版:虎
日期:2008-12-10 07:47:462009新春纪念徽章
日期:2009-01-04 14:52:28数据库板块每日发贴之星
日期:2009-02-08 01:01:03生肖徽章2007版:蛇
日期:2009-03-09 22:18:532009日食纪念
日期:2009-07-22 09:30:00
10#
发表于 2010-7-23 21:30 | 只看该作者
NULL的类型不应该脱离应用的上下文来讨论。

create or replace view vw_test as select null d from dual union all select 1 from dual;


DESC VW_TEST;
Name                                                                                Null?    Type
----------------------------------------------------------------------------------- -------- ------------------
D                                                                                            NUMBER

create or replace view vw_test as select null d from dual;

DESC VW_TEST;

Name                                                                                Null?    Type
----------------------------------------------------------------------------------- -------- ----------
D                                                                                            VARCHAR2

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表