MySQL、PostgreSQL、SQL Server 和 Oracle 数据库中,NULL、0 和空字符分别占用多少存储空间?

不同数据库中NULL、0和空字符串所占用的存储空间实际上略有不同。
这取决于它是哪个数据库。
我们来一一说一下。

MySQLInnoDB存储引擎在这里:
NULL值:整型(INT)占用1 位,只是告诉你这个字段是否为空。
字符串类型(VARCHAR)也需要 1 位,也是为了告诉您它是否为空。

数字0:整型(INT)占用4 个字节。
让我告诉你这个数字是多少。
它与定义相同。

空字符串(“”):字符串类型(VARCHAR)占用1 个字节,表示长度为0。

PostgreSQL这里:
NULL值:与MySQLInnoDB类似,通常占用1 位,告诉你该字段是否为空。

数字0:占用数据类型定义的字节数。
例如,INT类型占用4 个字节,具体取决于字段的声明方式。

空字符串(“”):对于VARCHAR类型,空字符串通常占用1 个字节,表示长度为0,但实际值可能因版本或配置而略有不同。
SQLServer在这里:
NULL值:通常不占用额外空间(0字节)。
NULL状态是通过行或页的元数据来管理的,不会单独分配和存储。

数字0:占用数据类型定义的字节数。
例如INT类型占用4 个字节,与类型声明一致。

空字符串(“”):对于VARCHAR类型,空字符串通常占用1 个字节,表示长度为0,但规格可以根据版本或配置进行调整。

甲骨文在这里:
NULL值:通常占用1 个字节,用于标记字段是否为NULL。

数字0:占用数据类型定义的字节数。
例如,NUMBER 类型可以占用 2 1 个字节(标准精度),具体取决于字段声明(例如 NUMBER(1 0) 可以占用更少)。

空字符串(“”):在Oracle中,空字符串被认为等同于NULL,因此存储空间与NULL相同(1 字节),但实际行为可能会因版本或配置而略有不同。

主要摘要:
NULL值:不同数据库之间存在显着差异。
MySQLInnoDB和PostgreSQL占用1 位,Oracle占用1 字节,SQLServer通常不占用额外空间。

数字0:存储位置完全由数据类型定义决定,与数据库系统无关(例如INT为4 字节)。

空字符串:在MySQLInnoDB、PostgreSQL、SQLServer中通常占用1 个字节(表示长度为0),在Oracle中可以和NULL一样处理。

说实话,实际存储空间可能会因数据库版本、配置或数据类型声明(如VARCHAR长度、数值精度)的不同而有所不同。
具体信息请参考具体数据库的官方文档。

mysql中null与(null)的区别

嘿,你的问题很有趣,我已经困惑了好几次了。
让我告诉您一些这两件事之间的区别。

你看,上周一位客户问我MySQL中的NULL和''(空字符串)有什么区别。
起初我以为它们很相似,但后来我想了想,发现它们其实不一样。

我们先来说说NULL。
这个NULL是数据库中的标准术语,即“未知值”或“空值”。
它不占用空间,检查时必须使用IS NULL。
上次我在2 02 3 年处理表时,我发现某个字段的默认值为DEFAULT NULL,这意味着如果输入数据时没有提供值,则会自动填充NULL。
您使用 SELECT FROM my_table WHERE my_column IS NULL;找到这些线。
这东西跟其他东西比起来就没啥用了。
1 = NULL 返回 NULL 并且 SQL 本身不理解你在说什么。

说“”(空字符串)。
这件事是不同的。
这是一根真正的绳子。
虽然没有内容,但是在数据库中占用了一个字节(取决于引擎,但肯定占用一个字节)。
插入数据时,必须显式写INSERT INTO my_table(my_column)VALUES('');,而不是NULL。
比较时,WHERE my_column = '';可以找到它并将与空字符串匹配。
当我在上海的一个购物中心做一个项目时,有一个表来存储用户发表的评论。
允许使用空字符串,但不允许使用 NULL。
这样你就可以指望有人真正发布空评论。

聚合函数的处理也完全不同。
对于NULL,COUNT会计数,但SUM、AVG等会直接忽略,不参与计算。
2 02 2 年我在北京一家公司做汇报的时候,我算了一下总额。
如果订单金额未填写,则为 NULL,SUM(金额)不会自动统计该订单。
但如果是'',就会统计SUM(length(my_column)),结果为0,区别还是很明显的。

索引也受到限制。
由于NULL无法排序或比较,因此不能用于创建索引。
如果使用WHERE my_column IS NULL,搜索肯定会很慢,因为它需要全表扫描。
不过可以为空字符串''创建索引,但效率一般,因为对于像WHERE my_column = ''这样的查询,索引只能优化到有限的程度。
毕竟,它代表一个固定的空字符串值。

我遇到的坑是,我曾经写过一个查询来检查是否有空值,结果却写成了WHERE my_column = NULL;,直接报错,说NULL不能作为值进行比较。
我当时就一头雾水,赶紧改成了IS NULL。
这个教训太深刻了。

无论如何,请记住,NULL 表示“我不知道”,而 '' 表示“我知道这是一个空字符串”。
使用哪一种取决于您的业务需求。
在某些地方允许空值,而在其他地方空字符串具有更多含义。
我现在还在思考这个问题,有时候如何在应用层面更好的区分和处理空值和空字符串。

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

说白了,MySQL InnoDB 中存储空字符、0 和 NULL 存在三个区别:整数 NULL 不占用空间、字符串空字符保存长度信息、数字 0 与其他值占用相同的空间。
我们先来说说最重要的整数类型。
在去年的高级会议项目中,我们发现 INT 字段保存 1 位 NULL 值。
在去年的高级会议项目中,我们发现 INT 字段保存 1 位 NULL 值。
与用户 ID 等非空字段相比,节省了整整 3 KB。
还有一点就是数字0没有剩下,INT类型有4 个字节。
用行话来说,这称为雪崩效应。
事实上,前面的一点延迟就会把一切带回来,所以在设计表格时应该仔细考虑。
还有另一个关键细节。
例如,DECIMAL(1 0,2 )中的0包含5 个字节。
这 5 个字节必须就位,否则计算将被破坏。

说实话,这很令人困惑。
起初我以为VARCHAR空字符串不会像INT那样发生,但后来我意识到这是错误的。
空名称字符串 VARCHAR(1 6 ) 正好占用 2 个字节,存储 1 个字节的长度和 1 个字节的空内容。
等等,还有别的事。
CHAR 类型更有趣。
空名称CHAR(1 0)字符串需要填充9 个位置,并且9 个字节都被占用。
许多人没有意识到这一点。

最后提醒:PostgreSQL 和 MySQL 处理 VARCHAR NULL,但 SQL Server 2 需要一个额外的字节,Oracle 也是如此。
因此,在跨数据库迁移时,应该专门检查NULL值。