Странное поведение при сравнении int и null

 
0
 
MySQL
ava
maxipub | 02.11.2016, 14:17
Добрый день!

Таблица:

--
-- Структура таблицы `test5`
--

CREATE TABLE IF NOT EXISTS `test5` (
  `col_1` int(11) DEFAULT NULL,
  `col_2` int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

--
-- Дамп данных таблицы `test5`
--

INSERT INTO `test5` (`col_1`, `col_2`) VALUES
(1, NULL),
(2, 2),
(3, 333);


Запрос:

SELECT * FROM test5 WHERE col_1 != col_2


Результат:

col_1    col_2
3    333


Побочный результат:

:shok  :wacko  :dash1

Это нормально, что при WHERE col_1 != col_2 MySQL не считает что 1 != NULL ?

И как быть???
Kommentare (6)
ava
Akina | 02.11.2016, 15:23 #
Запомни. ЛЮБОЕ сравнение, в котором фигурирует Null, всегда даёт Null, который интерпретируется как False. И неважно, на равенство или на неравенство. Исключение - маскирование функциями IFNULL() и COALESCE().


Цитата (maxipub @  2.11.2016,  15:17 findReferencedText)
как быть?

Проверять на Null. Отдельно.
Либо, если есть некие значения, которые гарантированно отсутствуют в значении поля, использовать их. Например, если значения строго положительны, можно так:

-- если два Null считать не равными
WHERE COALESCE(col_1, -1) != COALESCE(col_2, -2)
-- если два Null считать равными
WHERE COALESCE(col_1, -1) != COALESCE(col_2, -1)
ava
Zloxa | 03.11.2016, 10:39 #
Цитата (Akina @  2.11.2016,  16:23 findReferencedText)
ЛЮБОЕ сравнение, в котором фигурирует Null, всегда даёт Null, который интерпретируется как False.

1) Логический эквивалент null принято называть unknown
2) Не совсем верно утверждение, что Null (Unknown) интерпретируется как false. Unknown это третье, особенное состояние. Не даром эту логику называют трехзначной. Отличие от False очевидно на примере: not(False) = True, но not(Unknown) = Unknnown.

Для трехзначной логики действует своя собственная таблица истинности, отличная от двухзначной логики. Например unknown and false = false, а unknown and true = unknown. К сожалению в доке масе, как и в доке по MsSQL это крайне плохо расписано. Очень хорошо мозг на место, мне лично, поставила дока по ораклу, где таблица истинности прописана явно, и явно выявлено состояние unknown.

Результат Whrere conidtion проверяется ture, соответственно в нем результат Unknown возымеет тот же эффект, что и False.
Однако, к примеру Check condition проверяется на false, в нем Unknown будет работать так же как True
ava
maxipub | 03.11.2016, 10:52 #
AkinaZloxa, ребята, спасибо в очередной раз, все понятно разъяснили.

Единственное, так и не понял - зачем так делать? Если col_1 != col_2, значит нам надо все что не равно. Можно надумать что Unknown гипотетически может быть равен 1... Но ведь на о он и Unknown, что не 1. У нас же тут не какая-то теоретическая математика, а прагматичная СУБД. В этом плане мне логика PHP на 100% близка и рациональная с их логическим подходом к NULL.
ava
Zloxa | 03.11.2016, 10:58 #
Цитата (maxipub @  3.11.2016,  11:52 findReferencedText)
зачем так делать?

Это все понапридумывали американцы. Закрепили это ANSI. А русский человек теперь мучайся  :girl_crazy
ava
Zloxa | 03.11.2016, 10:58 #
Цитата (maxipub @  3.11.2016,  11:52 findReferencedText)
зачем так делать?

Это все понапридумывали американцы. Закрепили это ANSI. А русский человек теперь мучайся  :girl_crazy
ava
Zloxa | 03.11.2016, 12:57 #
Цитата (maxipub @  3.11.2016,  11:52 findReferencedText)
зачем так делать?

Порассуждали в курилке с пацанами на тему: "зачем бы в SQL использовалась трехзначная логика, коли от нее одни лишь проблемы".
Пофантазировали на тему что было бы, будь она двузначна. Решили что было бы очень плохо. Если предполагать за Null неопределенное значение, то неопределенность мы можем сравнивать лишь на равенство(=) и строгое неравенство (!=). Операции "больше", "меньше", "между" с неопределенным значением возвращать должны неопределенный результат, а значит, в двузначной логике не представимы. Реализация двузначной логики привела бы к тому, что операции сравнения были бы запрещены для применения к наборам, содержащим неопределенные значения. Ввод третьего состояния логики решает эту проблему, но имеет свою цену в виде так не любимого всеми правила, что все операции сравнения с неопределенностью приводят к неизвестному результату.
Registrieren Sie sich oder melden Sie sich an, um schreiben zu können.
Unternehmen des Tages
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Mitwirkende
  Akina ava  Zloxa   maxipub
advanced
Absenden