mysql null php null

Что такое null и как с этим жить: сравнение с null в PHP, тонкости в приведении типов данных

В работе с любыми данными то и дело требуется как-то обозначить их отсутствие. Новички зачастую для этой цели используют значение false, которое, по сути, является не отсутствием данных, а определённым значением типа boolean. Для того, чтобы как-то помечать неопределённость или отсутствие данных, существует специальное значение null. Про false, null и прочее уже немало сказано и добавить что-то оригинальное крайне сложно. Но гораздо сложнее бывает найти баг, вызванный неочевидным поведением этих штуковин. Поэтому, вдохновлённый одним таким багом, самым элегантным в моём послужном списке, я решил написать маленькую шпаргалку на эту тему.

Перегружать пост интересными, но довольно-таки бесполезными определениями из Википедии я не стану. Вместо этого перейду сразу к делу и приведу цитату со страницы php.net, посвящённой null:

До этого момента всё кажется простым, но чтобы так оставалось и дальше, при работе с null нужно придерживаться определённых правил.

Математические операции с null

Во всех математических операциях null ведёт себя аналогично int(0):

Проверка переменной на null

Чтобы точно узнать, что переменная содержит null (то есть, ничего не содержит), нужно использовать либо специальную функцию is_null() либо тождественное сравнение ===, а любые другие способы не подойдут:

Проверка null if-выражениях, а так же в функциях empty() и isset()

Тут переменные с null ведут себя абсолютно предсказуемо, как и любые другие ложные значения (которые в if-выражениях приводятся к false). Но нужно помнить, что это не гарантирует нам, что в переменной находится именно null:

Сравнение двух null

В PHP как гибкое, так и тождественное сравнение двух null всегда возвращает false, в отличие от многих других платформ, где сравнение двух неизвестностей возвращает так же неизвестность (то есть, null).

Поведение null при нетождественном сравнении с приведением типов данных

PHP разрешает сравнивать null-ы не только между собой, но и с другими типами данных. При этом не стоит забывать, что гибкое сравнение в php не является транзитивным, то есть, если два значения равны третьему по отдельности, не гарантирует их равенство между собой. Согласно таблицам приведения типов, гибкое сравнение null при помощи оператора == с разными значениями возвращает разные результаты:

Исследование null в JavaScript (а вместе с ним и загадочного undefined) заслуживает отдельной статьи. Главное отличие состоит в том, что, не смотря на приведение типов, null в JavaScript ничему не равен, кроме самого null и этого самого undefined, хотя в if-выражениях и срабатывает аналогично false. А при сравнении с числами он выдаёт ещё более забавные результаты, чем в PHP.

NULL в MySQL, к примеру, действует гораздо более прямолинейно. Он просто при любых действиях с null (даже при сравнении двух null) возвращает null. С его точки зрения, при любых действиях с неизвестностью в результате получится какая-то другая неизвестность 🙂

Простое правило при работе null, которое помогает избегать проблем

Источник

NULL поля в MySQL

Вступление

Часто на форумах и даже в учебниках пишут о том, что лучше не использовать NULL поля в MySQL. В этих утверждениях смущает тот факт, что никто не удосуживается объяснить, почему NULL – это зло. Эта заметка призвана разобраться, что такое NULL в MySQL и так ли страшен чёрт, как его малюют.

Что такое NULL?

Наряду с множеством типов данных в БД, NULL стоит особняком. NULL означает отсутствие значения.
Зачем использовать особый тип данных для того, чтоб указать отсутствие значения, когда можно просто вставить пустую строку, например? Этот вопрос мне всегда казался глупым, и я удивляюсь тому, как в книгах и статьях уделяют ему достаточное количество внимания.

Чем опасен NULL?

Сравнение NULL с любым другим значением, даже с родственным (в большинстве языков программирования, в частности, в PHP null, 0, false это одно и то же, если не применять строгого сравнения, которое включает сравнение типов) ему FALSE вернёт NULL. Отсюда следует первая ловушка.
Допустим, у нас есть таблица:

Добавим в неё 2 записи:

INSERT INTO users (name, family) VALUES(‘Андрей’, ‘Романов’), (‘Иван’, NULL);

В случае, если вы захотите объединить имя и фамилию, получив ФИО одним полем, например, таким запросом:

SELECT CONCAT(name, ‘ ‘, family) FROM `users`

MySQL не оправдает ваших ожиданий. Вы получите NULL вместо Ивана.

mysql null php null. Смотреть фото mysql null php null. Смотреть картинку mysql null php null. Картинка про mysql null php null. Фото mysql null php null

Немного неожиданно, правда?
На деле же ничего неожиданного нет, если вы помните, что любая операция с NULL вернёт NULL, кроме специальных операций, предназначенных для работы с NULL: IS NULL, IS NOT NULL, IFNULL()

Сортировка по NULL

Всего лишь хочу опровергнуть некоторые фразы из русского мануала MySQL о том, что при сортировке по столбцу, содержащим NULL значения, эти самые NULL значиния всега оказываются наверху. Это не так.

SELECT name, family FROM `users` ORDER BY family ASC

mysql null php null. Смотреть фото mysql null php null. Смотреть картинку mysql null php null. Картинка про mysql null php null. Фото mysql null php null

SELECT name, family FROM `users` ORDER BY family DESC

mysql null php null. Смотреть фото mysql null php null. Смотреть картинку mysql null php null. Картинка про mysql null php null. Фото mysql null php null

Как видим, NULL считается наименьшим значением, и порядок сортировки на него действует.

Группировки и NULL

Все просто.
MySQL группирует по NULL так же как и по любому другому полю.

Добавим нашей таблице users столбец score INT UNSIGNED NULL;

mysql null php null. Смотреть фото mysql null php null. Смотреть картинку mysql null php null. Картинка про mysql null php null. Фото mysql null php null

Подсчитаем сколько всего пользователей набрали то или иное количество очков, т.е. сгруппируем выборку по полю score
SELECT COUNT(*), score FROM `users` GROUP BY score

mysql null php null. Смотреть фото mysql null php null. Смотреть картинку mysql null php null. Картинка про mysql null php null. Фото mysql null php null

Как видно, MySQL сгруппировала 2 строки с score = NULL

Индексы и NULL

Откуда-то ходит заблуждение о том, что MySQL не использует индексы, если столбец может принимать значения NULL.
Это не так!

Проведём несколько экспериментов.

Выберем все записи, где score = NULL. Не забываем, что мы для этого должны использовать конструкцию IS NULL
EXPLAIN SELECT * FROM `users` WHERE score IS NULL

mysql null php null. Смотреть фото mysql null php null. Смотреть картинку mysql null php null. Картинка про mysql null php null. Фото mysql null php null

Индекс используется.

Выберем все записи, где количество очков больше, например, пяти.
EXPLAIN SELECT * FROM `users` WHERE `score` > 5

mysql null php null. Смотреть фото mysql null php null. Смотреть картинку mysql null php null. Картинка про mysql null php null. Фото mysql null php null

Индекс используется.

Найдем пользователя, у которого ровно 7 очков
EXPLAIN SELECT * FROM `users` WHERE `score` = 7

mysql null php null. Смотреть фото mysql null php null. Смотреть картинку mysql null php null. Картинка про mysql null php null. Фото mysql null php null

Индекс используется.

Можно сделать вывод: заблуждение действительно таковым и оказалось.
Можно смело использовать NULL-поля при создании индекса и индекс будет работать.

Когда следует использовать NULL?

Ранее я привел пример таблицы сайтов, которая содержит поле PR.
PR – это целочисленное значение, которое может принимать значение 0, к тому же оно может быть в состоянии «не посчитано». Как реализовать хранение такого свойства в таблице?

Зачем отказываться от того, что язык предлагает тебе «из коробки»?
Значение NULL для такого поля подходит идеально. NULL – означает «нет значения», т.е. оно ещё не посчитано. Если значение равно нулю, значит оно действительно равно нулю. Все просто.

Второй пример подходящего случая для использования NULL – это поле-потомок.

Поле-потомок указывает на id записи из другой (или же этой же таблицы). Примером такого поля может быть parent_id.

Выводы

Нет причин бояться создания NULL полей. Надо хорошо понимать, что NULL в MySQL это не ноль и не false – это отсутствие значения. Надо знать, как MySQL работает с NULL: нюансы есть, но их не много. У MySQL нет проблем с индексацией NULL полей.

Источник

Mysql null php null

Очень часто начинающие администраторы баз данных MySQL сталкиваються с проблемой обработки значения NULL из-за своего неправильного понимания этого значения. В этой статье попробуем разобрать что за зверь это значение NULL.

Основные грабли закапаны как раз при сравнение значения NULL с другими значениями стандартными спосабами, но давайте попорядку.

Особенности значения NULL в MySQL.

Попробуем разобраться на следующих примерах. Сравним NULL с логическим значением FALSE, с пустой строкой, с нулем, с самим сабой (т.е. cо значением NULL) и проанализируем полученные результаты.

Вывод: NULL не равно логическому значению FALSE.

Вывод: NULL не равно целочисленному нулю.

Вывод: NULL не равно пустой строке

Вывод: NULL не равно NULL

Обработка значения NULL в запросе MySQL.

Как же обрабатывать значение NULL? В базах данных MySQL существуют специальные операторы IS NULL и IS NOT NULL для правильного сравнения значений с NULL.

Этот запрос выведит строки содержащие значение NULL.

А этот запрос выведит все строки, кроме строк содержащих значение NULL.

Помните, что при сравнение каких либо значение c NULL, всегда будет полyчен результат NULL.

Ниже представлены неправbльные запросы, которые невыведут ни одной строки.

Вот и все. Делайте правельные выборки из баз MySQL содержащих NULL.

1″ :pagination=»pagination» :callback=»loadData» :options=»paginationOptions»>

Источник

NULL в MySQL. Руководство для начинающих

Главное меню » MySQL » NULL в MySQL. Руководство для начинающих

mysql null php null. Смотреть фото mysql null php null. Смотреть картинку mysql null php null. Картинка про mysql null php null. Фото mysql null php null

Введение в NULL в MySQL

В MySQL значение NULL означает неизвестное. Значение NULL отличается от нуля (0) или пустой строки ”.

Значение NULL не равно ни к чему, даже сам по себе. Если вы сравниваете значение NULL с другим значением NULL или любым другим значением, результатом является то, что значение NULL каждого значения NULL неизвестно.

Обычно значение NULL используется для указания того, что данные отсутствуют, неизвестны или неприменимы. Например, номер телефона потенциального клиента может быть NULL и может быть добавлен позже.

Когда вы создаете таблицу, вы можете указать, принимает ли столбец значения NULL или нет, используя ограничение NOT NULL.

Например, следующий оператор создает таблицу leads:

В таблице leads столбец id является столбцом первичного ключа, поэтому он не принимает никаких значений NULL.

Столбцы first_name, last_name и source используют ограничение NOT NULL, следовательно, вы не можете вставить любые значения NULL в эти столбцы, в то время как emailи phoneстолбцы принимают значения NULL.

Вы можете использовать NULLзначение в выражении INSERT, чтобы указать, что данные отсутствуют. Например, следующий оператор вставляет строку в таблицу leads. Поскольку номер телефона отсутствует, поэтому используется значениеNULL.

Поскольку значение по умолчанию для столбца электронной почты – это NULL, вы можете опустить электронную почту в выражении INSERT следующим образом:

SET NULL в заявлении UPDATE

Чтобы установить значение столбца в NULL, вы используете оператор присваивания ( =). Например, чтобы обновить телефон Lilu Dalas до NULL, вы используете следующую инструкцию UPDATE:

Если вы используете предложение ORDER BY для сортировки результирующего набора в порядке возрастания, MySQL считает, что значения NULL ниже, чем другие значения, поэтому NULL сначала он представляет значения.

Следующее утверждение сортирует клиентов по номеру телефона в порядке возрастания.

Если вы используете ORDER BY DESC, значения NULL появляются в конце набора результатов. Смотрите следующий пример:

Для проверки NULL в запросе вы используете оператор IS NULL или IS NOT NULL в предложении WHERE.

Например, чтобы получить потенциальных клиентов, которые еще не указали номер телефона, вы используете оператора IS NULL следующим образом:

Вы можете использовать оператора IS NOT, чтобы получить все лиды, которые предоставили адреса электронной почты.

Даже если значение NULL не равно NULL, два значения NULL равны в предложении GROUP BY.

Запрос возвращает только две строки, потому что строки, столбец электронной почты, у которых NULL сгруппирован в одну.

NULL и индекс UNIQUE в MySQL

Когда вы используете ограничение UNIQUE или индекс UNIQUE для столбца, вы можете вставить несколько значений NULL в этот столбец. Это прекрасно, потому что в этом случае MySQL считает, что значения NULL различны.

Давайте проверим этот момент, создав индекс UNIQUE для столбца phone.

Обратите внимание, что если вы используете механизм хранения BDB, MySQL считает, что значения NULL равны, поэтому вы не можете вставить несколько значений NULL в столбец с уникальным ограничением.

Функция NULL в MySQL

MySQL предоставляет несколько полезных функций, которые эффективно обрабатывают NULL: IFNULL, COALESCE и NULLIF.

Функция IFNULL принимает два параметра. Функция IFNULL возвращает первый аргумент, если он не NULL, в противном случае она возвращает второй аргумент.

Например, следующий оператор возвращает номер телефона, если это не NULL, иначе он возвращает N/A вместо NULL.

Функция COALESCE принимает список аргументов и возвращает первый аргумент не-NULL. Например, вы можете использовать функцию COALESCE для отображения контактной информации о потенциальной возможности в зависимости от приоритета информации в следующем порядке: телефон, электронная почта и N/A.

Функция NULLIF принимает два аргумента. Если два аргумента равны, функция NULLIF возвращает NULL. В противном случае она возвращает первый аргумент.

Функция NULLIF полезна, если у вас есть как NULL и пустые строковые значения в столбце. Например, по ошибке вы вставляете в таблицу leads следующую строку :

Телефон представляет собой пустую строку вместо NULL.

Если вы хотите получить контактную информацию о потенциальных клиентах, вы получите пустой телефон вместо электронного письма в виде следующего запроса:

Чтобы исправить это, вы используете функцию NULLIF для сравнения телефона с пустой строкой, если они равны, он возвращает NULL, в противном случае он возвращает номер телефона.

Из этой статьи вы узнали, как работать с NULL в MySQL и как использовать некоторые удобные функции для обработки запросов NULL.

Если вы нашли ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter.

Источник

Using PHP/PDO to set a NULL value

Using PHP/PDO I’m trying to set a MySQL (mysql-5.0.96) variable named “flt_status” whose default is set to ‘NULL’ and which is defined as INT(5), nullable, to NULL.

There are a number of threads here on StackOverFlow (11692773, 1391777) that cover this topic but none of them seems to work for me.

My (very abbreviated) code looks like this;

I’ve tried a number of techniques outlined in the above discussions and others I’ve found using Google but every time the value of flt_status comes out as zero (0). I’ve tried using both PDO::PARAM_NULL and PDO::PARAM_INT.

I’ve included the IP and SUNRISE variables in this example so I can better understand any example the more experienced PHP/PDO programmers out there give me.

Can someone show me what I’m doing wrong?

Thanks in advance for any assistance you can offer.

mysql null php null. Смотреть фото mysql null php null. Смотреть картинку mysql null php null. Картинка про mysql null php null. Фото mysql null php null

4 Answers 4

You are doing several things wrong.

First, you’re apparently using smart quotes instead of straight quotes. Code needs straight quotes.

Next, you put a : prefix before ip but you missed that prefix before the other two named parameters. You need a : before each one.

Also, you don’t need to put quotes around the variables.

This is fine except for the continued use of smart quotes.

Okay, except that you are not checking for errors. Unless you have enabled PDO’s attribute for throwing exceptions, you need to check the return status of prepare() and execute() because they return false if there’s any error. This continues to be one of the most common mistakes among PHP developers!

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *