Рейтинг:1

Почему MariaDB CHAR_LENGTH возвращает NULL вместо 0, когда поле имеет значение NULL?

флаг gb
Tim

Я пытаюсь рассчитать общий размер хранимых метаданных в таблице, используя CHAR_LENGTH, чтобы сложить размер соответствующих полей в каждой строке, чтобы получить приблизительное представление о размере хранилища набора результатов.

Мне не нужен размер всех данных в таблице, только размер набора результатов.

Однако некоторые поля в таблице имеют значения NULL, и как только CHAR_LENGTH достигает одного из них, весь расчет завершается ошибкой, поскольку CHAR_LENGTH возвращает NULL, а не 0.

Например:

ВЫБЕРИТЕ СУММУ(размер_строки) как `всего` ОТ ( ВЫБЕРИТЕ CHAR_LENGTH(`поле1`)+CHAR_LENGTH(`поле2`)+CHAR_LENGTH(`поле3`)+CHAR_LENGTH(`поле4`) как `строка_размер` ИЗ `мета_данных` ГДЕ `идентификатор ` = 1 И `id2` = 2 ) как tbl1;

Для некоторых запросов это работает, и я получаю размер в байтах, но для тех, у которых есть значение NULL в любом поле в любой строке результатов, я ничего не получаю.

Почему CHAR_LENGTH не возвращает 0 для значения NULL?

Я полагаю, что следующая лучшая вещь — вернуть результаты и перебрать их в коде, чтобы сложить размер. Я надеялся избежать этого, но может быть это единственный способ?

флаг jp
Dom
https://mariadb.com/kb/en/char_length/: «Если аргумент равен NULL, он возвращает NULL». Так что это не баг, а фича ;-). Я пытаюсь решить проблему с помощью SUM или CONCAT, но безуспешно.
флаг jp
Dom
ВЫБЕРИТЕ CHAR_LENGTH (IFNULL (ноль, "")); работает и возвращает 0 !
флаг jp
Dom
SELECT SUM(row_size) как `total` FROM ( SELECT CHAR_LENGTH(IFNULL(`field1`, ''))+CHAR_LENGTH(IFNULL(`field2`, '')+CHAR_LENGTH(IFNULL(`field3`, ''))+ CHAR_LENGTH(IFNULL(`field4`, '')) as `row_size` FROM `meta_data` WHERE `id` = 1 AND `id2` = 2 ) as tbl1;
djdomi avatar
флаг za
это связано с ошибкой сервера? нет, это Stackfault, да?! :-)
Michael Hampton avatar
флаг cz
Нет, это принадлежит [dba.se]
Рейтинг:1
флаг ua

Окружите каждую СЛИЯТЬ(..., 0).

mysql> SELECT CHAR_LENGTH(null), CHAR_LENGTH(''), CHAR_LENGTH('abc');
+-------------------+---+------------ ---------+
| CHAR_LENGTH(нуль) | CHAR_LENGTH('') | CHAR_LENGTH('abc') |
+-------------------+---+------------ ---------+
| НУЛЕВОЙ | 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;
+-----+----------+
| Лен | char_len |
+-----+----------+
| 16 | 4 |
+-----+----------+

Имейте в виду, что в любой строке есть накладные расходы - может быть, запятая между ними, может быть, новая строка, может быть что-то еще.

Также, CHAR_LENGTH() дает символ считать, а не байт считать.

флаг gb
Tim
Отличный ответ. Спасибо.
Рейтинг:0
флаг cn

Почему CHAR_LENGTH не возвращает 0 для значения NULL?

Так как Любые функция (за исключением NVL(), очевидно) вернет NULL, если передан аргумент NULL. Формально:

f(НУЛЬ) == НУЛЬ

Важнее:

НУЛЬ != '' 

Пустая строка — это… ну… пустая строка.
NULL отмечает отсутствие данных.

Не то же самое.
(Если, конечно, вы не пытаетесь использовать данные типа varchar в базе данных Oracle, которая еще не могу сказать разницу, даже в 2020-х годах).

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.