大众计算机学习网

专门提供各种电脑教程

正确理解数据库中的空值null

Admin | 2011-1-22 10:00:14 | 被阅次数 | 14534

  数据库中的数据表,每个字段都可以设置不同的数据类型。

  而某些数据库字段,默认产生的值就是空值,空值在显示的时候,是通过NULL来显示的。

  所以,很多人都对“空值”产生疑问,例如通过编程新建的一个表,表中所有数据皆显示为NULL,手动添加并删除文字后又变成了空白;一个字符串类型的字段,明明没有填值,却不等于"";用ADO.NET从数据库中取值,又会出现错误。

  一切问题的根源在于空值的误解及应用。这需要我们正确认识.NET和SQL Server中几种不同的“空值”。

  ①真正的空值

  等同“没有输入的值”,可以出现在大多数类型的字段中(除非默认不允许为空),SQL server中表示为null,显示为NULL,手工在SQL server企业管理器中输入的方法是按Ctrl+0。它在.NET中对应System.DBNull.Value。

  在T-SQL命令中,判断一个值是不是空值,要用“is null”而不是“= null”;处理空值有个ISNULL函数,它使用指定的值替换null。用ADO.NET从数据库得到的空值无法自动转化为空字符串或Nothing,须手动检测:如果得到System.DBNull.Value,则赋给数据对象Nothing或其它自定义的有意义的值。

  ②空字符串(零长度字符串)

  只出现在字符串类型(如nvarchar)的字段中,SQL server中表示为' ',显示为空白,手工在SQL server企业管理器中输入时清空一个单元格即可。它在.NET中对应System.String.Empty,也就是我们常用的""。在T-SQL命令中处理空字符串和处理一般的字符串没什么区别。用ADO.NET从数据库得到的空字符串也和一般的字符串没什么区别。

  相关的概念还有VB.NET中的Nothing和对应于C#.NET中的null(注意这个null是C#.NET中的null而非SQL Server中null),它们在.NET中是表示不引用任何对象的空引用的值,在传入SQL server时,根据不同的上下文环境,可能存为真正的空值(比如在更新一个字符串类型的字段值时),也可能调用在SQL server中自定义的默认值(比如传给一个有默认值的存储过程参数),也可能因为无法进行类型转换而引发.NET异常。因此在用ADO.NET向SQL server中存储数据时,大家一定要小心使用Nothing。

  ③举例应用:如何检索到数据库中的空值和null

  数据库中没有的值分为这么几种:

  (1)NULL 如果看上去单元格是空白的,那就是NULL值。

  (2) 0 偶尔一些单元格会默认为'0',这个0可能是char也可能是int,所以分0,'0'(即单引号+0)。

  (3)null 此null非彼NULL,这个null是'null'(即单引号+null).本人就遇到过一次,在代码中,所有为空的值都用null填充,本意是填充为NULL,结果最后都成了'null',就是四个字母组成的字符串。

  要将以上三条都检索出来,可以用下面的句子,即使你不是3点全符合也可以用,反正不漏掉一个就好。

  SELECT id_GradeBase,id_College,id_MajorSecMajor 
  FROM XsStu
  WHERE id_GradeBase ='0' or  id_College='0' or id_MajorSecMajor ='0' or ISNULL(id_GradeBase,'') + '' = '' or    ISNULL(id_College,'') + '' = '' or  ISNULL(id_MajorSecMajor,'') + '' = '' or id_GradeBase ='null' or id_College ='null' or   id_MajorSecMajor ='null'