我正在尝试使用 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年代)。