2008-10-31 63 views
8

我很想知道如何将NULL存储到数据库中?如何将NULL存储在数据库中?

它肯定取决于数据库服务器,但我想对此有一个大概的想法。


首先尝试:

假设服务器放在一个未定义的值(可以是任何东西),进入该领域的NULL值。

难道你是非常幸运和检索

...WHERE field = 'the undefined value (remember, could be anything...)' 

第二个尝试NULL值:

服务器是否有标志或任何元数据的地方,表示此字段为空?

然后服务器必须读取这个元数据来验证字段。

如果元数据显示NULL值,如果查询没有“字段为空”, 那么该记录将被忽略。


这似乎太容易了......

+1

服务器不具备某种形式的标志,并且服务器读取元数据来验证特殊NULL指标场。正因为值为NULL,这并不意味着该记录将被忽略 - 很多,很多(通常很复杂)的原因。 – 2008-11-01 15:50:26

回答

2

服务器通常使用元数据信息,而不是魔法值。所以有些地方会指定字段是否为空。

- 亚当

9

MySQL使用第二种方法。它将每行的数据(每列一个)与数据存储在一起,以指示哪些列为空,然后将该字段的数据留空。我很确定所有其他数据库都是如此。

第一种方法的问题是,您确定无论您为数据选择什么值都不会显示为有效数据吗?对于某些值(如日期或浮点数),这是正确的。对于其他人(如整数),这是错误的。

1

IBM的Informix Dynamic Server使用特殊的值来表示空值。例如,SMALLINT(16位,带符号)的有效值范围是-32767 .. + 32767。另一个值-32768被保留以指示NULL。对于INTEGER(4字节,带符号)和BIGINT(8字节,带符号)也是如此。对于其他类型,它使用其他特殊表示(例如,SQL FLOAT和SMALLFLOAT的所有第1位 - 分别称为C double和float)。这意味着它不必使用额外的空间。

IBM DB2 for Linux,Unix,Windows使用额外的字节来存储空指示器; AFAIK,它为每个可空字段使用一个单独的字节,但我可能在这个细节上是错误的。

因此,正如所指出的,机制因DBMS而异。

1

指定NULL的特殊值的问题是迟早会插入特殊值。例如,它会被插入到表中,指定了不同的数据库服务器

| DBServer  | SpecialValue | 
+--------------+--------------+ 
| 'Oracle'  | 'Glyph'  | 
| 'SQL Server' | 'Redmond' | 

;-)