Null из PHP в SQL запрос - за и против.

Фанат

oncle terrible
Команда форума
Хочу прибегнуть к коллективному разуму в таком вопросе.
Частенько в квери билдерах можно встретить такой код, который превращает ПХП-шный NULL в Mysql-евский NULL.
Ну то есть, если мы подставляем в запрос переменную, и эта переменная содержит NULL, то запрос получается вида
PHP:
field=NULL
в противном случае
PHP:
field='содержимое переменной'
Сам я считаю такой подход неправильным - значение нуллов в PHP и mysql может быть совершенно разным.
И у меня в первом случае будет
PHP:
field=''
поэтому хотелось бы послушать чужие мнения, а ещё лучше - примеры из практики, в которых оправдывался, или наоборот - порицался тот или иной способ.

или по-другому: мешала ли когда-нибудь кому-то автоматическая замена NULL в РНР на NULL в запросе?
или наоборот - мешала ли замена NULL в РНР на пустую строку в запросе?
 

флоппик

promotor fidei
Команда форума
Партнер клуба
я предпочитаю ошибку по непереданному аргументу (== null)
а если нужен null — DB::expr('NULL')
 

MiksIr

miksir@home:~$
Постоянно нужна. Только я ожидаю от "билдера", не field=NULL а field IS NULL
 

Фанат

oncle terrible
Команда форума
Постоянно нужна. Только я ожидаю от "билдера", не field=NULL а field IS NULL
а можно привести пример, какой-нибудь псевдокод, который с этим работает?
следует учитывать, что у нас именно переменная, то есть, заранее неизвестно, нулл там или не нулл
 

Василий М.

Новичок
И у меня в первом случае будет
PHP:
field=''
и зачем это нужно в БД?
Какой сакральный смысл хранить пустую строку?

Я в своей обертке-маппере реализовал следующее:
PHP:
            else
            {
                value_is_scalar:

                // Пустые строки в базу не пишем, вместо них пишем NULL
                if ($value === null || $value === '')
                {
                    $sql .= '`' . $options['db_field_name'] . '` = NULL, ';
                }
                else
                {
                    $sql .= '`' . $options['db_field_name'] . '` = "?s", ';

                    $args[] = $value;
                }
            }
теперь пустые строки не храню.
 

MiksIr

miksir@home:~$
Нет, именно переменная - не готов утверждать, что использую. Хотя отложу в память - если где-то столкнуть - напишу.
А вот null как значение передаваемое в билдер - ясно дело что часто, при всяких left join.
И меня бы напрягали всякие DB::expr('NULL'), ибо если null - значит я передал null сам, иначе же я получу notice сообщение о неопределенной переменной.
Хотя, дело привычки
 

MiksIr

miksir@home:~$
и зачем это нужно в БД?
Какой сакральный смысл хранить пустую строку?
Сакральный смысл в том, что пустая строка - это пустая строка, т.е. это значение с пустой строкой. А NULL - это отсуствие значения. Т.е. сакральный смысл приблизительно как между $f == '' и $f === ''.
Ясно дело, что это важно лишь тогда, когда важно и используется. Ну например, абстрактно, торар с ценой NULL - это нет цены, не поставили еще, а с ценой 0 - бесплатный. Описание NULL - нет описание, не внес дядька еще его, а пустая строка - решил оставить его пустым. Особо принципиально NULL становится при наличии внешних ключей - какое-то значение - это уже значение, даже 0, т.е. должна быть ссылка по ключу, а NULL - это нет значения.
 

флоппик

promotor fidei
Команда форума
Партнер клуба
ибо если null - значит я передал null сам, иначе же я получу notice сообщение о неопределенной переменной.
Хотя, дело привычки
Вообще-то в пхп нет разницы между неинициализированной переменной и переменной со значением null, если мне не изменяет память, т.е. isset вернет false в обоих случаях, т.е. нельзя однозначно утверждать, что именно ты туда null передал. Если бы это было бы не так — явно указывать что это выражение null не пришлось бы.
 

Вурдалак

Продвинутый новичок
Василий М., в каком-нибудь Postgres твой код работать не будет, если поле будет NOT NULL.
 

Фанат

oncle terrible
Команда форума
Какой сакральный смысл хранить пустую строку?
Хороший вопрос.
Именно что сакральный смысл - в служении св. Оккаму. Мы не производим никаких дополнительных телодвижений, оно так в базу попадает в результате само.

Хочется понять - стоит овчинка этих дополнительных телодвижений.
 

fixxxer

К.О.
Партнер клуба
А у меня, с моими шаблонизаторами, все явно ;)
{{ s(key) }}
{{ sNul(key) }}

Это в основном для insert/update.

Насчет IS NULL вместо равенства - вот ни одного случая не помню, чтобы было нужно. Обычно или явно пишешь IS NULL, либо NULL вообще не нужно.
 

MiksIr

miksir@home:~$
Вообще-то в пхп нет разницы между неинициализированной переменной и переменной со значением null, если мне не изменяет память, т.е. isset вернет false в обоих случаях, т.е. нельзя однозначно утверждать, что именно ты туда null передал. Если бы это было бы не так — явно указывать что это выражение null не пришлось бы.
Ну... null по сути и значит неинициализированный, так что это нормально. Но у нас есть стрикт который это отслеживает. Так что вопрос "а что у нас в функции - неинициализированное или null" реально только при отключенным стрикт может быть.
 

MiksIr

miksir@home:~$
Насчет IS NULL вместо равенства - вот ни одного случая не помню, чтобы было нужно. Обычно или явно пишешь IS NULL, либо NULL вообще не нужно.
А, это баян про билдеры опять.
Мне вот array("field" => null) как то приятнее чем array("field IS NULL"). Ну хотя бы потому, что билдер сможет заэскейпить field.
 

fixxxer

К.О.
Партнер клуба
Не, я не про билдеры. В билдере я бы сделал "field" => null конечно
 

MiksIr

miksir@home:~$
А, ты про то, что обычнно в использовании поля бывает или filed = 5 или field IS NULL? Ну наверно это больше... гм... привычки в постраении базы. Ну вот например, у меня сейчас есть одно поле в 3-х состояниях Да/Нет/NULL, т.е. NULL тут играет роль "условие не определено, оба вариант подходят", при выборке, соответсвенно, мы делаем field = 1 OR field IS NULL
 

Василий М.

Новичок
Сакральный смысл в том, что пустая строка - это пустая строка, т.е. это значение с пустой строкой. А NULL - это отсуствие значения.
и часто у вас в программах переменная содержащая null и пустую строку несет разную логику? не заполненное поле формы - это самый настоящий NULL - нет значения. и в субд пихать пустую строку нет никакого смысла.
 

MiksIr

miksir@home:~$
и часто у вас в программах переменная содержащая null и пустую строку несет разную логику?
Пример выше был
не заполненное поле формы - это самый настоящий NULL - нет значения
Все верно. Не заполненное поле - это NULL. А заполненное пустой строкой поле - это пустая строка. Если вам в базе не нужно разделение на пустую строку и NULL - то обычно поступают прямо противоположно и используют специально придуманную для этого SQL конструкцию NOT NULL DEFAULT ''.
 

Василий М.

Новичок
причем здесь варчар?

NULL - нет значения. Тип такой в СУБД.
Если пользователь не заполнил поле в форме, то это именно то и значит - НЕТ ЗНАЧЕНИЯ.
Пустая строка - это от хитрости PHP.
 
Сверху