我正在尝试使用 CHAR_LENGTH 计算表中存储的元数据的总大小,以将每行中相关字段的大小相加,以大致了解结果集的存储大小。
我不想要表中所有数据的大小,只想要一组结果的大小。
但是,表中的某些字段具有 NULL 值,一旦 CHAR_LENGTH 达到其中之一,整个计算就会失败,因为 CHAR_LENGTH 返回 NULL 而不是 0。
例如:
SELECT SUM(row_size) as `total` FROM ( SELECT CHAR_LENGTH(`field1`)+CHAR_LENGTH(`field2`)+CHAR_LENGTH(`field3`)+CHAR_LENGTH(`field4`) as `row_size` FROM `meta_data` WHERE `id` = 1 AND `id2` = 2 ) as tbl1;
对于某些查询,这是可行的,我得到了以字节为单位的大小,但对于任何在结果的任何行中的任何字段上具有 NULL 值的查询,我什么都得不到。
为什么 CHAR_LENGTH 不会为 NULL 值返回 0?
我想下一个最好的事情是取回结果并在代码中迭代它们以增加大小。我希望避免这样做,但这可能是唯一的方法吗?
用 包围每个
COALESCE(..., 0)
。请注意,任何字符串中都有开销——它们之间可能有逗号,可能是换行符,也可能是其他内容。
此外,
CHAR_LENGTH()
给出字符数,而不是字节数。因为如果传递了一个 NULL 参数,任何函数(显然除了 NVL() 之类的函数)都将返回 NULL。正式地:
更重要的是:
一个空字符串是..好吧..一个空字符串。
NULL 表示没有数据。
不是一回事。
(当然,除非您尝试在 Oracle 数据库中使用 varchar 数据,但即使在 2020 年代,这仍然无法区分)。