如果列为null,是否会影响该列所使用的空间?使用的空间是否由列定义固定?这在不同的数据库中是否有所不同。(我主要对SQL Server 2000感兴趣。)
澄清:这个问题与列“可空”时发生的事情无关(正如Kritsen & gbn指出的那样,这需要额外的成本)。问题是,当列实际上是null (在某些特定的行中)时,有什么节省吗?
..。
Cadaeic为SQL Server提供了答案,这似乎在SQL Server 2008版之前不会节省成本,而根据Quassnoi的说法,如果空列在最后,您可以在Oracle中节省成本。谢谢你的回答,他们都很有帮助。
发布于 2009-02-17 21:04:51
在列中存储NULL并不会特别耗费或节省空间。对于固定长度的数据,仍保留整个空间。
另一方面,可变长度数据只需要数据的长度加上存储实际长度的开销。例如,VARCHAR(n)将使用2字节的数据来表示实际长度,因此所需的存储空间始终为n+2。
此外,需要注意的是,如果将ANSI_PADDING设置为ON,则具有空值的char(n)将表现为VARCHAR(n)。
无论如何,在使用SQL Server2000或SQL Server2005时,您不会意识到存储NULL所节省的空间。SQL Server2008引入了稀疏列的概念,它可以为主要为NULL的列带来节省。
发布于 2009-02-17 11:33:49
SQL Server有一个位表示为NULL。如果将列定义为NOT NULL,则不使用此位
VARCHAR使用可变长度来存储数据(因此具有指示实际数据长度的开销),而CHAR是固定宽度的。
因此,在此基础上,CHAR(1) NOT NULL比VARCHAR(1) NOT NULL“短”,因为VARCHAR需要一个长度指示符,并且CHAR将始终只使用一个字节。
编辑:请注意,允许NULL的位字段需要两位来存储它!我经常看到位字段没有考虑到这一点,不需要存储NULL,但没有设置为not NULL,因此无意中浪费了一些位
发布于 2009-02-17 11:50:47
在Oracle中,它取决于列的类型及其在行中的位置。
如果NULL列是行的最后一列,那么它们根本不会占用任何空间。Oracle预先计算了每一行的总行大小,所有不适合的都被认为是NULL。
如果NULL列后面有一些非NULL数据,那么NULL将存储为单字节的0xFF (即NULL类型)。
空的VARCHAR2等同于NULL。如果你测试从SELECT列表返回的文字NULL的类型,它会给你一个VARCHAR2(0)。
https://stackoverflow.com/questions/556363
复制相似问题