Пытаясь проверить, была ли определена переменная, я обнаружил, что операторы 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', то есть они будут действовать, как ожидалось с нулевым значением.
SET @p = NULL + 1
, а не SET @p = NULL
перед тестированием. SET @p = 5; SET @p = NULL;
То есть сначала установите ненулевое значение, затем установите значение null 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)
. Но мне интересно объяснение, зачем это нужно. Спасибо.