Подтвердить что ты не робот

Что означает пункт "NOT NULL DEFAULT"?

Я видел это во многих полях в БД из проекта, над которым я работал, где столбец будет определен не null, но будет иметь пустую строку в качестве значения по умолчанию. какой смысл делать это? Если вы допустите пустую строку, почему бы просто не разрешить поле null?

4b9b3361

Ответ 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