Модераторы: skyboy
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Странное поведение при сравнении int и null 
V
    Опции темы
maxipub
Дата 2.11.2016, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Добрый день!

Таблица:

Код
--
-- Структура таблицы `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


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

smile  smile  smile 

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

И как быть???

Это сообщение отредактировал(а) maxipub - 2.11.2016, 14:17
PM MAIL   Вверх
Akina
Дата 2.11.2016, 15:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Запомни. ЛЮБОЕ сравнение, в котором фигурирует Null, всегда даёт Null, который интерпретируется как False. И неважно, на равенство или на неравенство. Исключение - маскирование функциями IFNULL() и COALESCE().


Цитата(maxipub @  2.11.2016,  15:17 Найти цитируемый пост)
как быть?

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

-- если два Null считать не равными
WHERE COALESCE(col_1, -1) != COALESCE(col_2, -2)
-- если два Null считать равными
WHERE COALESCE(col_1, -1) != COALESCE(col_2, -1)



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 3.11.2016, 10:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(Akina @  2.11.2016,  16:23 Найти цитируемый пост)
ЛЮБОЕ сравнение, в котором фигурирует 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.

Результат Where condtition проверяется на ture, соответственно в нем результат Unknown возымеет тот же эффект, что и False. 
Однако, к примеру, Check condition проверяется на false, в нем Unknown будет работать так же как True


Это сообщение отредактировал(а) Zloxa - 3.11.2016, 10:51


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
maxipub
Дата 3.11.2016, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



AkinaZloxa, ребята, спасибо в очередной раз, все понятно разъяснили.

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


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



del

Это сообщение отредактировал(а) Zloxa - 3.11.2016, 11:01


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Zloxa
Дата 3.11.2016, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(maxipub @  3.11.2016,  11:52 Найти цитируемый пост)
зачем так делать?

Это все понапридумывали американцы. Закрепили это в своем ANSI. А русский человек теперь мучайся  smile 

На самом деле, кода привыкнешь мыслить в трехзначной логике, на if (val==null) начинает жудко бомбить.


Это сообщение отредактировал(а) Zloxa - 3.11.2016, 11:02


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Zloxa
Дата 3.11.2016, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(maxipub @  3.11.2016,  11:52 Найти цитируемый пост)
зачем так делать?

Порассуждали в курилке с пацанами на тему: "зачем бы в SQL использовалась трехзначная логика, коли от нее одни лишь проблемы".
Пофантазировали на тему что было бы, будь она двузначна. Решили что было бы очень плохо. Если предполагать за Null неопределенное значение, то неопределенность мы можем сравнивать лишь на равенство(=) и строгое неравенство (!=). Операции "больше", "меньше", "между" с неопределенным значением возвращать должны неопределенный результат, а значит, в двузначной логике не представимы. Реализация двузначной логики привела бы к тому, что операции сравнения были бы запрещены для применения к наборам, содержащим неопределенные значения. Ввод третьего состояния логики решает эту проблему, но имеет свою цену в виде так не любимого всеми правила, что все операции сравнения с неопределенностью приводят к неизвестному результату.


Это сообщение отредактировал(а) Zloxa - 3.11.2016, 12:59


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0797 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.