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

上周,我对比了一下MySQL InnoDB、PostgreSQL、SQL Server和Oracle数据库中空字符串、数字0和NULL的存储空间占用情况。
MySQL InnoDB里,整型字段NULL不占空间,数字0占4 字节。
字符型字段空字符串紧凑行格式下不占空间,非紧凑行格式可能占1 字节,NULL也只占1 位比特。

PostgreSQL里,空字符串和数字0都不占空间,NULL也不占空间,它通过元数据标记存在性。
SQL Server和PostgreSQL类似,空字符串和NULL都不占空间,数字0占4 字节。

Oracle里,空字符串默认为NULL,占3 字节,非空定义时按最大长度占用。
数字0占数据类型定义的最大长度,NULL固定占3 字节。

总体来说,PostgreSQL和SQL Server在空值优化上做得最好,适合存储大量稀疏数据。
Oracle虽然严格,但牺牲了空间效率。
MySQL需要考虑行格式,紧凑行格式可以节省空字符串空间。
高频更新或大量NULL值的场景建议选择PostgreSQL/SQL Server,需要严格数据类型的场景可考虑Oracle。
你看着办。

isnull函数的用法

isnull()检查NULL,小心空字符串误导。
SQL筛选NULL,SQL Server可能把空串当NULL。
Pandas .isnull()也查NULL,但和SQL用法不同。
不同数据库,NULL处理不同,MySQL和SQL Server区别大。
显式写条件,避免隐式转换出错。
你自己掂量。

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

MySQL InnoDB INT NULL 1 bit,0 不占空间;VARCHAR/CHAR 空字符串 N字节,NULL 1 bit。
PostgreSQL NULL 1 bit,0 不占空间,空字符串 不占空间。
SQLServer NULL 1 -1 6 字节,0 不占空间,空字符串 2 字节。
Oracle NULL 1 字节,0 不占空间,空字符串 VARCHAR2 3 字节,CHAR 固定长度。
优化:MySQL InnoDB VARCHAR/CHAR,PostgreSQL 频繁空字符串,Oracle CHAR固定长度。