Я видел это во многих полях в БД из проекта, над которым я работал, где столбец будет определен не null, но будет иметь пустую строку в качестве значения по умолчанию. какой смысл делать это? Если вы допустите пустую строку, почему бы просто не разрешить поле null?
Что означает пункт "NOT NULL DEFAULT"?
Ответ 1
У NULL есть особое поведение: сравнение чего-либо с NULL дает вам NULL
, что не что иное, как false
или 0
. Это означает "неизвестно".
Например, возьмите эту таблицу:
user_id | gender
------------------
1 | NULL
2 | 'M'
3 | 'F'
4 | 'F'
SELECT * FROM mytable WHERE gender = 'M'
вернет 1 строку, как ожидалось
SELECT * FROM mytable WHERE gender != 'M'
вернет 2 строки, а не 3 строки.
SELECT * FROM mytable WHERE gender != 'M' OR gender IS NULL
вернет ожидаемые 3 строки.
Изменить: для некоторых приложений использование 0
(или, не дай Бог, другое "магическое число" ) вместо NULL
даже не рекомендуется (единицы измерения или точные значения в данном примере не актуальны):
Date | Temperature
--------------------------
2010-01-01 | 10
2010-01-02 | 4
2010-01-03 | 0
2010-01-04 | -22
2010-01-05 | -45
2010-01-06 | NULL
2010-01-07 | -34
Здесь NULL
от 6 января означает "значение неизвестно" - возможно, потому, что температура была настолько низкой, что датчик термометра прекратил отвечать. Однако это совершенно иное значение, чем 3 января, когда температура была 0
, то есть 0 градусов.
Кроме того, как упоминает @Bill Karwin, NULL ведут себя специально в совокупных функциях (COUNT
, SUM
, AVG
и т.д.): вычисление AVG(Temperature)
по приведенным выше данным даст вам -14.5
, поскольку NULL-строка игнорируется.
Ответ 2
null и "" - это не одно и то же, поэтому здесь нет противоречия.
Что смысловое значение null/ "зависит от человека и часто является" религиозным "вопросом. Для некоторых людей в некоторых схемах, конечно, они могут быть одинаковыми, но они не обязательно должны быть. Например," "может означать, что я явно спросил пользователя для ввода, и они решили ничего не вводить", в то время как null может означать "я даже не просил ввода".
Ответ 3
Существует разница между нулевым значением и пустой строкой - по крайней мере, в SQL.
SELECT LENGTH('tata');
4
SELECT LENGTH(NULL);
NULL
SELECT LENGTH('tata')-LENGTH('');
4
SELECT LENGTH('tata')-LENGTH(NULL);
NULL
Ответ 4
Большинство языков программирования, которые взаимодействуют с базой данных, не поддерживают NULL, который работает так, как это делается в базе данных. Например, в С#, null < > DbNull.Value. В VB большинство типов данных не могли справиться с нулевой семантикой, например. вы не могли сохранить нуль в Дате или Int и т.д. Уменьшая количество нулей, которые видят клиентские программы, тем меньше головных болей. В случае VB закрывается то, что означает, что null для строк является пустым, что является чем-то более близким к неинициализированному, не совсем тем же значением, что и NULL в смысле "неизвестного"
Ответ 5
Потому что иногда на некоторых языках запрос "select" дает вам строку NULL, и вам нужно будет проверить, является ли она реальной строкой с содержимым "NULL" или она действительно является нулевой.
С "" это проще всего (IMHO)
Ответ 6
Мы не допускаем null, потому что программный доступ к полю из datatable с использованием значения DBnull вызывает исключение, в то время как пустая строка имеет значение и, следовательно, не является ошибкой.
Ответ 7
В дополнение к тому, что упоминалось в @Piskvor, эта практика также существует, чтобы предотвратить некоторые потенциальные NullPointerExceptions в логике приложения при заполнении beans/объектов и т.д. после чтения из DB