我很想知道如何将NULL存储到数据库中?
这肯定取决于数据库服务器,但我想对它有一个大概的想法。
首先尝试:
假设服务器将未定义的值(可能是任何值)放入字段中以获取NULL值。
你能非常幸运并使用
检索NULL值...WHERE field = 'the undefined value (remember, could be anything...)'
第二次尝试:
服务器是否有某个标志或某个元数据表明此字段为空?
然后服务器必须读取此元数据以验证该字段。
如果元数据指示NULL值,并且查询没有“field IS NULL”, 然后忽略记录。
这似乎太容易了......
答案 0 :(得分:9)
MySql使用第二种方法。它存储一个位数组(每列一个),每行包含数据,以指示哪些列为空,然后将该字段的数据留空。我很确定这对所有其他数据库也是如此。
第一种方法的问题是,您确定为数据选择的任何值都不会显示为有效数据吗?对于某些值(如日期或浮点数),这是真的。对于其他人(如整数),这是错误的。
答案 1 :(得分:3)
在PostgreSQL上,它使用一个可选的位图,每列一位(0为空,1不为空)。如果位图不存在,则所有列都不为空。
这与数据本身的存储完全分开,但与行位于同一页面上(因此行和位图一起读取)。
参考文献:
答案 2 :(得分:2)
服务器通常使用元信息而不是魔术值。所以有一些地方指出该字段是否为空。
- 亚当
答案 3 :(得分: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而异。
答案 4 :(得分:1)
特殊值表示NULL的问题是迟早会插入特殊值。例如,它将插入到表中,指定不同数据库服务器的特殊NULL指示符
| DBServer | SpecialValue |
+--------------+--------------+
| 'Oracle' | 'Glyph' |
| 'SQL Server' | 'Redmond' |
- )