Неожиданные результаты BLOB с MySQL проверка переменной NULL с IFNULL, COALESCE - PullRequest
0 голосов
/ 16 июня 2020

Пытаясь проверить, была ли определена переменная, я обнаружил, что операторы IF, IFNULL и COALESCE возвращают просто BLOB, а не значение, которое я ожидал, когда (а) переменная не была определена или (б) она была был явно установлен в NULL перед присвоением значения в сеансе. Я проверил это в MySQL версиях 5.7 и 8.0.

SELECT IF(@p IS NULL, 'is null', 'not null'); # 'is null' 
SELECT IF(@p IS NULL, 'is null', @p); # BLOB
SELECT IFNULL(@p, 'is null'); # BLOB
SELECT COALESCE(@p, 'is null'); # BLOB

Первый оператор действует так, как я ожидал, но остальные возвращают BLOB, а не 'is null'. Поведение такое же, если ему предшествует SET @p = NULL.

С другой стороны, если вы выполните любое из этих действий, все приведенные выше операторы вернут 'is null', то есть они будут действовать, как ожидалось с нулевым значением.

  1. SET @p = NULL + 1, а не SET @p = NULL перед тестированием.
  2. SET @p = 5; SET @p = NULL; То есть сначала установите ненулевое значение, затем установите значение null
  3. SELECT COALESCE(@p+1, 'is null') # используйте выражение @ p + 1 вместо @ p.

Предположительно, эти три каким-то образом установили тип для NULL. В любом случае неопределенная переменная или переменная, определенная только как NULL, имеет другой тип NULL, чем те, у которых есть история ввода (?).

Каков основной принцип, объясняющий такое поведение? Это просто нетипизированный NULL действует иначе, чем типизированный NULL, и эти операторы не работают с нетипизированными?

Примечание: я знаю, что это обходной путь для этого в процедуре, чтобы обнаружить неопределенные переменные , может быть

IF @p IS NULL
    SET @p = default_value
END IF;

, и похоже, что я также могу использовать COALESCE(@p+1,default_value). Но мне интересно объяснение, зачем это нужно. Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...