SQL Server中NULL的值是多少?

时间:2010-06-05 16:18:02

标签: sql-server null

我知道NULL不是零...也不是空字符串。但那么系统保留的NULL值是什么,以识别它?

7 个答案:

答案 0 :(得分:20)

NULL是SQL语言的一个特殊元素,它既不等于或不等于任何数据类型中的任何值。

正如您所说,NULL不是零,空字符串或false。即false = NULL会返回UNKNOWN

有人说NULL不是值,它是状态。没有价值的状态。有点像禅Koan。 : - )

我不知道MS SQL Server如何在内部存储它,但它没关系,只要它们根据SQL标准实现它。

答案 1 :(得分:10)

我相信对于每个允许空值的列,行都有一个空位图。如果指定列中的行为空,则位图中的位为1,否则为0.

答案 2 :(得分:10)

SQL Server行格式在MSDN中描述,并在各种博客上进行了分析,如Paul Randal的Anatomy of a Record。重要的信息是记录结构:

  
      
  • 记录标题      
        
    • 4个字节长
    •   
    • 两个字节的记录元数据(记录类型)
    •   
    • 记录中向前指向NULL位图的两个字节
    •   
  •   
  • 记录的固定长度部分,包含存储具有固定长度的数据类型的列(例如bigint,char(10),datetime)
  •   
  • NULL位图      
        
    • 记录中列数的两个字节
    •   
    • 在记录中每列存储一位的可变字节数,无论该列是否可以为空
    •   
    • 这允许在读取NULL列
    • 时进行优化   
  •   
  • 可变长度列偏移数组      
        
    • 可变长度列数的两个字节
    •   
    • 每个可变长度列两个字节,将偏移量赋予列值
    • 的末尾   
  •   
  • 版本标记      
        
    • 一个14字节的结构,包含一个时间戳加上一个指向tempdb
    • 版本存储区的指针   
  •   

因此NULL字段在NULL位图中设置了一个位。

答案 3 :(得分:7)

我怀疑采访者是否希望您确切知道SQL服务器如何存储null,这个问题的关键在于让您考虑如何存储特殊值。您不能使用标记值(或幻数),因为这会使任何具有该值的行突然变为null

有很多方法可以实现这一目标。想到的最直接的2是有一个标志存储每个可空值,基本上是isNull标志(这也基本上是Nullable<T>在.NET中的工作方式)。第二种方法是在每行中存储空标志的位图,每列一个。

当面对这样的面试问题时,绝对最糟糕的反应是坐下来茫然地盯着。大声思考,承认你不知道SQL Server是如何做到的,然后提出一些合理的方法来做到这一点。您还应该准备好谈谈为什么选择一种方法而不是另一种方法,以及每种方法的优点和缺点。

答案 4 :(得分:3)

比尔说,这是一个没有价值的州。

在表SQL Server中的一行中,它存储在空位图中:实际上没有存储任何值。

SQL Server的一个怪癖:

SELECT TOP 1 NULL AS foo INTO dbo.bar FROM sys.columns

什么数据类型是foo?它当然没有任何意义,但它让我感到一阵。

答案 5 :(得分:0)

从概念上讲,NULL表示“缺少未知值”,并且与其他值的处理方式略有不同。

在MySQL中,0或NULL表示false,其他任何表示都是true。布尔运算的默认真值为1。

GROUP BY中的两个NULL值被视为相等。

执行ORDER BY时,如果您执行ORDER BY ... ASC,则首先显示NULL值,如果执行ORDER BY ... DESC,则返回最后一个值。

答案 6 :(得分:0)

NULL的值本质上意味着缺失值,有些人也会使用术语unknow

Null值也不等于任何其他NULL

看看这些例子

将打印相等

IF 1 = 1
PRINT 'is equaL'
ELSE
PRINT 'NOT equal'

将打印相等(发生隐式转换)

IF 1 = '1'
PRINT 'is equaL'
ELSE
PRINT 'NOT equal'

将打印不相等

IF NULL = NULL
PRINT 'is equaL'
ELSE
PRINT 'NOT equal'