SQL Server中NULL的值是多少?

Rel*_*ity 5 sql-server null

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

Bil*_*win 20

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

正如你所说,NULL不是零,一个空字符串,或false.即false = NULL回归UNKNOWN.

有人说NULL不是一个值,它是一个状态.没有价值的状态.有点像Zen Koan.:-)

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


Adr*_*ciu 10

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


Rem*_*anu 10

在SQL Server行格式中描述MSDN,也分析了各种博客,像保罗·兰德尔的一个记录的剖析.重要信息是记录结构:

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

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


Don*_*nie 7

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

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

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