我知道NULL不是零...也不是空字符串。但那么系统保留的NULL值是什么,以识别它?
答案 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'