首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >数据库中空值使用的空间

数据库中空值使用的空间
EN

Stack Overflow用户
提问于 2009-02-17 11:21:48
回答 6查看 12.3K关注 0票数 22

如果列为null,是否会影响该列所使用的空间?使用的空间是否由列定义固定?这在不同的数据库中是否有所不同。(我主要对SQL Server 2000感兴趣。)

澄清:这个问题与列“可空”时发生的事情无关(正如Kritsen & gbn指出的那样,这需要额外的成本)。问题是,当列实际上是null (在某些特定的行中)时,有什么节省吗?

..。

Cadaeic为SQL Server提供了答案,这似乎在SQL Server 2008版之前不会节省成本,而根据Quassnoi的说法,如果空列在最后,您可以在Oracle中节省成本。谢谢你的回答,他们都很有帮助。

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 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的列带来节省。

票数 18
EN

Stack Overflow用户

发布于 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,因此无意中浪费了一些位

票数 10
EN

Stack Overflow用户

发布于 2009-02-17 11:50:47

Oracle中,它取决于列的类型及其在行中的位置。

如果NULL列是行的最后一列,那么它们根本不会占用任何空间。Oracle预先计算了每一行的总行大小,所有不适合的都被认为是NULL

如果NULL列后面有一些非NULL数据,那么NULL将存储为单字节的0xFF (即NULL类型)。

空的VARCHAR2等同于NULL。如果你测试从SELECT列表返回的文字NULL的类型,它会给你一个VARCHAR2(0)

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/556363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档