[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: NULL - зачем?
Страницы: 1, 2, 3
DedMorozzz
но при этом нулл не равен нулу, а в пхп равен.
В скл нулл это неопределённость и она ничему не равна

_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
Aeq
Цитата (DedMorozzz @ 6.11.2013 - 21:53)
На 1й странице описан этот помент
Повторюсь. использую псевдокод

Нулл в пхп:
null == null - true
null != null - false

В SQL:
NULL == NULL - false
NULL != NULL - false

К сожалению, для вас, в SQL NULL=NULL вернет NULL а не false, так же как и NULL!=NULL вернет NULL

Интересные штуки получаются когда NULL OR TRUE - вернет TRUE,
NULL AND TRUE - вернет NULL,
NULL OR FALSE - вернет NULL,
NULL AND FALSE - вернет FALSE (!).
Почему так получается - объясняется вполне логично smile.gif попробуйте подставить на место NULL true или false, если результат одинаковый, то с нуллом он и будет вполне конкретен, если разный, то с нуллом вернется нулл. В вариантах с вычислениями или сравнениями подставить true/false не достаточно, нужно подставить все возможные значения в данном контексте. Вполне хороший синоним для нулла - ХЗ )) А вот поведение нулла в пхп упрощено, и для динамической типизации так наверно и лучше.

А если по теме, то если вам не нужен null в колонке, то и определяйте колонку с флагом NOT NULL, насколько я знаю в классике все колонки должны быть как раз NOT NULL, вариант с NULL придумали уже в практических целях. Если не понимаете зачем он, то делайте все колонки NOT NULL, когда понадобится, тогда само придет понимание и будете использовать.

Еще простой пример по использованию нуллов: каждый день сотрудник метеостанции вводит значения влажности и температуры за окном.. Зимой у него предположим сломался градусник на пару недель, и он не вводил значения температуры, вводил только влажность. Если там будут ноли а не нуллы, то средняя температура этой зимой по данным метеорологов будет несколько выше чем на самом деле laugh.gif
DedMorozzz
Цитата (Aeq @ 6.11.2013 - 23:55)
в SQL NULL=NULL вернет NULL а не false, так же как и NULL!=NULL вернет NULL

спасибо, не знал.
Но с другой стороны оператор "иф" в sql работает именно с "тру" и "фолс".
По этому странно ожидать, что запрос вида
SELECT if(NULL != NULL,'yes','NO')

Обрабатыватся будет не булеаном

_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
Aeq
Цитата (DedMorozzz @ 7.11.2013 - 01:20)
Цитата (Aeq @ 6.11.2013 - 23:55)
в SQL NULL=NULL вернет NULL а не false, так же как и NULL!=NULL вернет NULL

спасибо, не знал.
Но с другой стороны оператор "иф" в sql работает именно с "тру" и "фолс".
По этому странно ожидать, что запрос вида
SELECT if(NULL != NULL,'yes','NO')

Обрабатыватся будет не булеаном

просто внутри функции иф производится 2 проверки: !=0 и is not null, тогда в результате всегда получится булев. в первой проверке сначала делается cast(expr AS SIGNED). можете сами проверить SELECT if ('asd', 'yes', 'no') вернет 'no' потому что asd в signed приведется как 0. про порядок проверок ниче сказать не могу, в код мускула не лазил xD
dr.nomore
Цитата
Because the result of any arithmetic comparison with NULL is also NULL, you cannot obtain any meaningful results from such comparisons.


А табличка сверху http://dev.mysql.com/doc/refman/5.0/en/wor...-with-null.html

Что касается php в котором null не такой. Ну ясень пень не такой. Что вам никак не мешает применять его как будто он такой же. То есть считать что арифметика с ним бесполезна, проверять надо отдельно и все такое.

Чтобы записать null через mysqli надо его забрать в одинарные кавычки 'null'. Живьем не канает.
DedMorozzz
Цитата (Aeq @ 7.11.2013 - 01:00)
просто внутри функции иф производится 2 проверки: !=0 и is not null, тогда в результате всегда получится булев. в первой проверке сначала делается cast(expr AS SIGNED). можете сами проверить SELECT if ('asd', 'yes', 'no') вернет 'no' потому что asd в signed приведется как 0. про порядок проверок ниче сказать не могу, в код мускула не лазил xD

2 проверки чего? Каждого элемента в условии? Это же заведомо не верно
В противном случае эти 2 ситуации должны были выдать одинаковый результат:
SELECT if ('asd'='asd', 'yes', 'no');
И
SELECT if ('asd'='asf', 'yes', 'no');

Но результаты разные и они полностью соответствуют ожиданию
Так что о каких проверках и проверках чего идёт речь?

_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
Aeq
Цитата (DedMorozzz @ 7.11.2013 - 16:49)
Цитата (Aeq @ 7.11.2013 - 01:00)
просто внутри функции иф производится 2 проверки: !=0 и is not null, тогда в результате всегда получится булев. в первой проверке сначала делается cast(expr AS SIGNED). можете сами проверить SELECT if ('asd', 'yes', 'no') вернет 'no' потому что asd в signed приведется как 0. про порядок проверок ниче сказать не могу, в код мускула не лазил xD

2 проверки чего? Каждого элемента в условии? Это же заведомо не верно
В противном случае эти 2 ситуации должны были выдать одинаковый результат:
SELECT if ('asd'='asd', 'yes', 'no');
И
SELECT if ('asd'='asf', 'yes', 'no');

Но результаты разные и они полностью соответствуют ожиданию
Так что о каких проверках и проверках чего идёт речь?

проверки первого аргумента.
тут же if это просто функция, а не конструкция языка. пишете 'asd'='asd', получается true, оно идет в функцию if(), внутри функции оно кастуется в целое если надо, и если не нулл и не равно нулю, то возвращается второй аргумент, иначе третий.
DedMorozzz
Aeq, вот этого дополнения - "проверки чего" и не хватало
Ещё раз спасибо за пояснения, работы мускула(даже вернее сказать SQL) в данном случае wink.gif

_____________
Если не говорить пользователям, что Linux это "Сложно и страшно", то им совершенно всё равно, в чём не разбираться
Aeq
Цитата (Aeq @ 7.11.2013 - 17:18)
Цитата (DedMorozzz @ 7.11.2013 - 16:49)
Цитата (Aeq @ 7.11.2013 - 01:00)
просто внутри функции иф производится 2 проверки: !=0 и is not null, тогда в результате всегда получится булев. в первой проверке сначала делается cast(expr AS SIGNED). можете сами проверить SELECT if ('asd', 'yes', 'no') вернет 'no' потому что asd в signed приведется как 0. про порядок проверок ниче сказать не могу, в код мускула не лазил xD

2 проверки чего? Каждого элемента в условии? Это же заведомо не верно
В противном случае эти 2 ситуации должны были выдать одинаковый результат:
SELECT if ('asd'='asd', 'yes', 'no');
И
SELECT if ('asd'='asf', 'yes', 'no');

Но результаты разные и они полностью соответствуют ожиданию
Так что о каких проверках и проверках чего идёт речь?

проверки первого аргумента.
тут же if это просто функция, а не конструкция языка. пишете 'asd'='asd', получается true, оно идет в функцию if(), внутри функции оно кастуется в целое если надо, и если не нулл и не равно нулю, то возвращается второй аргумент, иначе третий.

вообще я наверно погорячился со второй проверкой на is null, скорее просто все что не вернуло true на проверке !=0 идет в третий аргумент )))) хотел сказать изначально что if обрабатывает не только true или false
Aeq
Цитата (DedMorozzz @ 7.11.2013 - 17:34)
Aeq, вот этого дополнения - "проверки чего" и не хватало
Ещё раз спасибо за пояснения, работы мускула(даже вернее сказать SQL) в данном случае wink.gif

не за что. но НЕ вернее сказать SQL, т.к. в SQL нет конструкции if, это чисто специфика мускула, в постгресе такой функции например нет, как и конструкции. В хранимых процедурах конструкция if есть, но там уже не совсем SQL. Конструкция SQL которая есть в мускуле и постгресе (не знаю насчет стандарта вцелом), это case when then else end http://dev.mysql.com/doc/refman/5.7/en/case.html - в доке хоть пример и написан про хранимую процедуру, но этот синтаксис можно использовать в обычных запросах.
Zzepish
Давайте я поясню по проще!
''- строка. Значит имеет символы начала и конца строки В ЛЮБОМ СЛУЧАЕ.
NULL- вообще ничто
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.