Mysql

為什麼當欄位為 NULL 時 MariaDB CHAR_LENGTH 返回 NULL 而不是 0?

  • July 9, 2021

我正在嘗試使用 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)

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('😁😂😃😄') AS len, CHAR_LENGTH('😁😂😃😄') AS char_len;
+-----+----------+
| len | char_len |
+-----+----------+
|  16 |        4 |
+-----+----------+

請注意,任何字元串中都有成本——它們之間可能有逗號,可能是換行符,也可能是其他內容。

此外,CHAR_LENGTH()給出字元數,而不是字節數。

引用自:https://serverfault.com/questions/1069084