MySQL、PostgreSQL、SQL Server和Oracle中NULL、0和空字符串的存储空间究竟有多大?

哦,是的,是的,直到后来我才意识到这一点。

2 02 2 年,我在上海启动了一个项目,使用MySQL InnoDB来存储INT类型。
我当时很困惑。
我查了资料发现NULL其实只有1 位。
用于标记是否为空,不占用空间。
0 更经济并且不捕获任何东西。
就字符串而言,VARCHAR(N) 定义了最大长度。
空字符串“”按n个字节计算。
CHAR(N) 呃,所以固定为N个字节,不管是否为空。

后来用了PostgreSQL,发现NULL也是1 位,0还是不占位。
空字符串“”很有趣。
它根本不分配额外的空间,这可以避免麻烦。
我可能有偏见,但我认为 PostgreSQL 处理得很好。

再看SQL Server,NULL占用1 到1 6 个字节,具体取决于数据类型,变量长度0不占用这个。
空字符串“”固定为2 个字节。
这是怎么回事?没有仔细考虑。

Oracle 好吧,NULL 占用 1 个字节。
0 未被占用。
VARCHAR2 类型,空字符串“”占3 个字节,其中必须存储长度信息。
对于CHAR类型,空字符串“”有一个定义的长度,如CHAR(1 0),它保存固定的1 0个字节。

所以你看,NULL值是相当经济的,只需1 位到1 个字节。
值 0 并不普遍。
空字符串最好笑,MySQL CHAR有固定长度,而VARCHAR是根据最大长度计算的。
PostgreSQL 没有考虑到这一点。
SQLServer固定2 个字节。
Oracle VARCHAR2 3 字节保留,并且 CHAR 根据定义是固定的。

选择数据库的时候一定要考虑清楚。
如果字段通常为空字符串,您可以使用 PostgreSQL 节省一些空间。
如果需要固定长度的字符串,Oracle 的 CHAR 可能比较合适。

好了,就这些了。

MySQL、PostgreSQL、SQL Server和Oracle中空字符串、数字0和NULL占用空间有何区别

最近帮一位做数据分析的朋友调查了数据库空间使用的问题,觉得挺有趣的。
以前我并没有太关注这些细节,但现在看来,数据库里藏着不少小秘密。

记得今年在一个项目中使用了MySQL InnoDB。
此时数据量并不大,仅用于记录一些基本的用户信息。
当时我发现整数字段中的NULL值根本不占用任何实际的内存空间,只占用1 位。
这让我感到惊讶,因为我认为数据库非常智能。
那么数字0就占据了固定的4 个字节,这让我有点头疼,因为数据表中有很多这样的字段,预留的空间似乎有点浪费。

后来我改用PostgreSQL,发现这个数据库对空字符串的处理更加严格。
空字符串根本不占空间,数字0也是如此。
在我看来,我们当时的数据表有很多空字符串和零,这让我觉得PostgreSQL在空间效率方面做得相当不错。
此外,它还使用TOAST机制来压缩大数据对象。
小值,包括NULL、空字符串和0,都可以压缩到极限,而且磁盘占用量确实很小。

空字符串和 NULL 在 SQL Server 中的处理方式与 PostgreSQL 中的处理方式相同。
但是,如果字段定义为VARCHAR(MAX)或NVARCHAR(MAX),空字符串可能会占用一小部分元数据空间,这是我需要注意的。

Oracle 有点不同。
默认情况下,空字符串被视为NULL并占用3 个字节。
但是,如果您显式地将其定义为非空字段并插入空字符串,则它将占用该字段的数据类型定义的最大字节长度。
数字0也是如此,它根据数据类型定义的最大长度占用空间。
例如NUMBER(1 0)中的0占用2 1 个字节,因为Oracle的数字类型是变长编码。

综上所述,NULL值在MySQL、PostgreSQL和SQL Server中几乎不占用空间,而Oracle则占用固定的3 个字节。
空字符串在 PostgreSQL 和 SQLServer 中不占用磁盘空间,在 MySQL 的紧凑模式中也不占用磁盘空间。
Oracle默认为NULL,3 个字节。
数字0在MySQL和SQLServer中占用固定的4 个字节,PostgreSQL不占用空间,Oracle根据数据类型定义了最大长度。

在存储空间效率方面,PostgreSQL和SQL Server表现良好,适合存储大量稀疏数据。
在数据一致性方面,Oracle严格的类型定义保证了数据的完整性,但可能会导致存储空间效率的损失。
行格式影响 MySQL。
例如,COMPACT 行格式可以节省空字符串空间。
对于应用场景,更新频率高或者NULL值较多的场景可以选择PostgreSQL或者SQLServer。
对于数据类型要求严格的场景,可以考虑Oracle。

这件事确实很复杂,我得仔细处理。
哈哈,没想到学习数据库能学到这么多东西。

MySQL InnoDB中空字符、0和NULL值究竟占用多少存储空间?

好了,报告一下这些值在MySQL InnoDB中如何占用空间。

整数类型(INT类型)
数字0:必须占据整个字段的长度。
以INT为例。
固定为4 字节。
无论存储多少次0、1 或9 9 9 9 9 9 ,都会占用4 个字节。
这件事是完全真实的,并且与其他的事情不同。
NULL值:这个很好,不占空间。
只需用一种方式说“啊,这是空的”(即财务位置上的0或1 ),这确实不会占用多少硬盘空间。
例如,如果你有user_id INT NULL,这个NULL根本不消耗4 个字节,它是由该位标记的。

字符串类型(VARCHAR类型)
空字符串(''):两个必须替换。
说一根电线有多长是一回事,说它是空的又是另一回事。
例如,名称 VARCHAR(1 6 )(一个空字符串)占用 2 个字节。
为什么?因为长度最大为1 6 ,小于2 5 5 ,所以用1 个字节来表示长度,另外用1 个字节来清空内容。
另一个例子是VARCHAR(4 09 6 )的内容。
空字符串需要3 个字节,数据的长度需要2 个字节(因为4 09 6 大于2 5 5 ),加上空内容的1 个字节。
它需要多少字节取决于字段的最大长度。
2 5 5 以下。
1 占用一个字节; 2 5 5 以上,占2 字节。
NULL VALUE:它就像一个整数,不接受纯值。
只有一个粒子标记为“空”。
例如,名称 VARCHAR(1 6 ) 具有 NULL,则标头为 NULL。

其他类型(通用)
固定长度类型(CHAR类型): 空线程:必须填充该线程。
例如CHAR(X),空字符串必须占用1 0个字节,并且这1 0个位置必须用空格填充。
尽管物体是空的,但空间必须被填充。
NULL值:是同一个位,不占用空间。
数字类型(DECIMAL、NATO 等); 数字0:他得到了他应得的。
例如,在DECIMAL(1 0,2 )中,数字0必须占用5 个字节,与其类型长度相同。
NULL值:是同一个位,不占用空间。

与其他数据库的比较
PostgreSQL:与InnoDB类似,INT和VARCHAR不占用NULL空间。
SQL Server:NO INT 没有被占用,这很好。
但VARCHAR中的NO会占用超过2 个字节。
即使为空,也会使用两个字节。
Oracle:NULL INT和VARCHAR都多占用2 个字节。
与 SQL Server 相同的例程。

牌之和
NULL值:在InnoDB中,无论是INT还是VARCHAR,NULL代表的是实际不占用硬盘空间的最小位。
这与 PostgreSQL 相同,但与 SQL Server 和 Oracle 不同。
空字符串:空字符串类型存储数据的长度(1 或 2 个字节)和空字符串本身(1 个字节)。
字段的长度取决于占用的总空间。
Number 0:获取一个固定的空间来占据它的类。
例如,INT 与其他数字一样保存 4 个字节。

如何节省空间
该字段是否应该设置为NONE:如果您认为该字段经常为空,最好将其设置为NONE以节省空间。
不要总是使用 CHAR 来存储空字符串:CHAR 会填充空间,这是浪费。
VARCHAR存储空字符串,会占用一些索引长度的空间,但比填充位置要好。
VARCHAR 应该多长?你必须考虑一下。
如果太长,长度会占用更多字节;如果更短,还不够。
收入是一种平衡。

就是这样。
这些智能项目将帮助您节省数据库计划中的一些空间。