当字段为 NULL 时,为什么 MariaDB CHAR_LENGTH 返回 NULL 而不是 0?

当字段为 NULL 时,为什么 MariaDB CHAR_LENGTH 返回 NULL 而不是 0?

我正在尝试使用 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?

我认为下一个最佳方法是取回结果并在代码中迭代它们以增加大小。我希望避免这样做,但这可能是唯一的方法?

答案1

每个都用 包围COALESCE(..., 0)

mysql> SELECT CHAR_LENGTH(null), CHAR_LENGTH(''), CHAR_LENGTH('abc');
+-------------------+-----------------+--------------------+
| CHAR_LENGTH(null) | CHAR_LENGTH('') | CHAR_LENGTH('abc') |
+-------------------+-----------------+--------------------+
|              NULL |               0 |                  3 |
+-------------------+-----------------+--------------------+

mysql> SELECT COALESCE(CHAR_LENGTH(null), 0);
+--------------------------------+
| COALESCE(CHAR_LENGTH(null), 0) |
+--------------------------------+
|                              0 |
+--------------------------------+

mysql> SELECT LENGTH('

答案2

为什么 CHAR_LENGTH 不会为 NULL 值返回 0?

因为任何如果传递了 NULL 参数,函数(显然 NVL() 之类的函数除外)将返回 NULL。形式如下:

f(NULL) == NULL

更重要的是:

NULL != '' 

空字符串就是.. 嗯.. 一个空字符串。NULL
标记缺席数据的。

不一样。
(当然,除非你试图在 Oracle 数据库中使用 varchar 数据,这仍然看不出区别,甚至在2020年代)。

相关内容