MySQL Integer 0 против NULL - PullRequest
       6

MySQL Integer 0 против NULL

22 голосов
/ 16 февраля 2011

При использовании целочисленных столбцов лучше иметь 0 или NULL, чтобы указать отсутствие значения. Например, если таблица имеет поле parent_id, а конкретная запись не имеет родителя, вы бы использовали 0 или NULL. В прошлом я всегда использовал 0, это потому, что я пришел из мира Java, где (до 1.5) целые числа всегда должны были иметь значение. Я спрашиваю, главным образом, в отношении производительности, меня не слишком беспокоит вопрос о том, какой вариант является «более правильным».

Ответы [ 8 ]

26 голосов
/ 16 февраля 2011

Использование NULL предпочтительнее по двум причинам:

  1. NULL используется для обозначения того, что поле не имеет значения, что именно то, что вы пытаетесь смоделировать.*
  2. Если вы решите добавить некоторые ограничения ссылочной целостности в будущем, вам придется использовать NULL.
24 голосов
/ 30 января 2013

Объявите столбцы НЕ НЕДЕЙСТВИТЕЛЬНЫМИ, если это возможно. Это ускоряет операции SQL, позволяя лучше использовать индексы и устраняя накладные расходы на проверку того, является ли каждое значение NULL Вы также экономите место для хранения, один бит на столбец. Если вам действительно нужны значения NULL в ваших таблицах, используйте их. Просто избегайте настройки по умолчанию, которая допускает значения NULL в каждом столбце.

MySQL - оптимизация размера данных

6 голосов
/ 16 февраля 2011

использование NULL для «no value» в буквальном смысле правильно.0 - это значение для целого числа, поэтому оно имеет значение.NULL otoh буквально означает, что ничего нет, поэтому значения нет.

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

3 голосов
/ 16 февраля 2011

Вы не должны ожидать каких-либо реальных отличий в производительности от этой

2 голосов
/ 08 июня 2014

UNIQUE( id1, id2 ) не будет работать с нулевыми значениями, потому что это позволит, например, 1, null дважды

с другой стороны, если вы используете 0, JOIN atable ON this.extID = atable.ID соединение будет выполнено (в результате не будет объединено ни одной строки), тогда как NULL будет просто проигнорировано

В любом случае, я предлагаю всегда использовать «пустые значения» (например, 0 или пустую строку) вместо NULL, если только пустое значение не имеет значения, отличного от NULL

и я также изменяю запросы следующим образом: JOIN atable ON this.extID = atable.id AND extID > 0, что предотвращает выполнение бесполезного объединения

2 голосов
/ 16 февраля 2011

В вашем parent_id пример 0 вполне допустим, поскольку он обозначает «root». В большинстве случаев NULL является лучшим выбором для «без значения» логически.

Это не оказывает никакого влияния на производительность, о котором я знаю.

1 голос
/ 11 октября 2013

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

То есть, например, ваш столбец является внешним ключом. Поскольку внешние ключи обычно не начинаются с 0, а начинаются с 1, это означает, что вы не ожидаете, что 0 будет использоваться в качестве значения.

Затем вы можете использовать 0 для обозначения состояния значения «Нет». Использование его в соединениях не будет соответствовать ни одному столбцу другой таблицы. Таким образом, имея тот же эффект, что и NULL.

Но если у вас есть столбец, где значение 0 действительно имеет значение. Как например поле количества. И кроме этого, вам также нужно выразить и пустое значение. Например, для обозначения того, что количество еще не было введено. Тогда вам нужен NULL для этого.

Надеюсь, что это имеет смысл.

1 голос
/ 16 февраля 2011

0 по-прежнему является допустимым значением для целочисленного столбца.Следовательно, вы должны использовать NULL и разрешить null для этого столбца.Кроме того, если вы используете целочисленный столбец только для положительных чисел, то вы можете использовать -1 без значения.

В вашем примере для parent_id ссылка на 0 - это нормально, пока вы не убедитесь, что ссылочных идентификаторов нетначиная с идентификатора 0.

...