SQL Server中NULL的正确使用与空间占用

栏目: 数据库 · SQL Server · 发布时间: 7年前

内容简介:这篇文章主要介绍了SQL Server中NULL的正确使用与空间占用的相关资料,需要的朋友可以参考下

我们常在SQL Server的使用或维护中遇上NULL,那么什么是NULL?如下是MSDN给出的一段简短描述(见“Null Values”):

A value of NULL indicates that the value is unknown. A value of NULL is different from an empty or zero value. No two null values are equal. Comparisons between two null values, or between a NULL and any other value, return unknown because the value of each NULL is unknown.

通俗的讲,NULL就是一个值,而且这个值是未知的(unknown);NULL不能等价任何值,甚至都不等价它自己,即NULL不等于NULL。

为了清晰的理解上述的内容,我们创建一个测试表Test_NULL,然后对表插入2条含有NULL值的记录,并进行相关验证操作:

--创建一张允许NULL值的表
CREATE TABLE Test_NULL (
  num INT NOT NULL PRIMARY KEY
  ,fname NVARCHAR(50) NULL
  ,lname NVARCHAR(50) NULL
)

--对表插入4条数据:最后2条记录含有NULL值
INSERT INTO Test_NULL (num,fname,lname) VALUES(1, 'Tom','Jane')
INSERT INTO Test_NULL (num,fname,lname) VALUES(2, 'Dave','')
INSERT INTO Test_NULL (num,fname) VALUES(3, 'Aaron')
INSERT INTO Test_NULL (num,fname) VALUES(4, 'Betty')

为了验证NULL值是未知的,我们通过如下 SQL 查询表Test_NULL的记录,对lname字段进行=操作:

--若两个NULL是可以相等的,那么将输出4条记录。实际只输出2条记录

SELECT
  *
FROM Test_NULL tn 
LEFT JOIN Test_NULL g
  ON tn.num = g.num
WHERE tn.lname = g.lname
------------------------------------------
1  Tom Jane  1  Tom Jane
2  Dave    2  Dave  

--查询lname为''的记录,即验证NULL不等于''
SELECT
  *
FROM Test_NULL tn
WHERE tn.lname = ''
------------------------------------------
2  Dave  

正确查询/使用SQL Server中的NULL

由于NULL是未知的,因此在SQL Server默认情况下我们不能使用=或<>去判断或查询一条NULL的记录(见上述),正确的方式是:使用IS NULL或IS NOT NULL去查询或过滤一条含有NULL的记录。

另外有函数ISNULL(),可判断并转换NULL为其他值。

--通过IS NULL查询含有NULL的记录
SELECT
  *
FROM Test_NULL tn
WHERE tn.lname IS NULL
------------------------------------------
3  Aaron  NULL
4  Betty  NULL

--NULL不等于任何值,甚至NULL不等于NULL
--默认不能使用<>或=匹配NULL
SELECT
  *
FROM Test_NULL tn
WHERE tn.lname <> NULL OR tn.lname = NULL
------------------------------------------

但需注意:SQL Server仅是在默认情况下不能使用=或<>,当设置ANSI_NULLS为OFF后,即可使用=或<>查询NULL值

换言之,SQL Server默认是开启ANSI_NULLS选项的。

--设置ANSI_NULLS为OFF,并使用=NULL查询记录
SET ANSI_NULLS OFF
SELECT
  *
FROM Test_NULL tn
WHERE tn.lname = NULL
------------------------------------------
3  Aaron  NULL
4  Betty  NULL

插入或更新NULL值:

--插入1条含有NULL的新记录
INSERT INTO Test_NULL (num,fname,lname) VALUES(5, 'Serena', NULL)

--更新某条记录的字段值为NULL
UPDATE Test_NULL SET fname = NULL
WHERE num = 2

NULL的空间占用

通常的认识是:NULL在可变长类型(如nvarchar(50),varchar(8))中是不占用空间的,在固定长度的类型(如int)中会占用存储空间。

实际上,上述的认识不够严谨。真实情况是,NULL在可变长与固定长度的类型中均会占用空间

在SQL Server非Sparse Columns中,存储NULL的值需1个bit的NULL bitmap mask。


以上所述就是小编给大家介绍的《SQL Server中NULL的正确使用与空间占用》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

UNIX网络编程 卷1:套接字联网API(第3版)

UNIX网络编程 卷1:套接字联网API(第3版)

[美]W. 理查德•史蒂文斯(W. Richard Stevens)、比尔• 芬纳(Bill Fenner)、安德鲁 M. 鲁道夫(Andrew M. Rudoff) / 匿名 / 人民邮电出版社 / 2014-6-1 / 129.00

《UNIX环境高级编程(第3版)》是被誉为UNIX编程“圣经”的Advanced Programming in the UNIX Environment一书的第3版。在本书第2版出版后的8年中,UNIX行业发生了巨大的变化,特别是影响UNIX编程接口的有关标准变化很大。本书在保持前一版风格的基础上,根据最新的标准对内容进行了修订和增补,反映了最新的技术发展。书中除了介绍UNIX文件和目录、标准I/......一起来看看 《UNIX网络编程 卷1:套接字联网API(第3版)》 这本书的介绍吧!

随机密码生成器
随机密码生成器

多种字符组合密码

SHA 加密
SHA 加密

SHA 加密工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具