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

MySQL Integer 0 против NULL

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

4b9b3361

Ответ 1

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

  • NULL используется для обозначения того, что поле не имеет значения, что именно вы пытаетесь моделировать.
  • Если вы решите добавить некоторые ограничения ссылочной целостности в будущем, вам придется использовать NULL.

Ответ 2

Объявляйте столбцы, если это возможно, NOT NULL. Это ускоряет выполнение SQL-операций, позволяя лучше использовать индексы и устраняя накладные расходы для тестирования, является ли каждое значение NULL. Вы также сохраняете некоторое пространство для хранения, по одному бит за столбец. Если вам действительно нужны значения NULL в ваших таблицах, используйте их. Просто избегайте значения по умолчанию, которое допускает значения NULL в каждом столбце.

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

Ответ 3

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

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

Ответ 4

Вы не должны ожидать, что разница в реальной жизни от этого

Ответ 5

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

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

Ответ 6

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, который предотвращает выполнение бесполезного соединения

Ответ 7

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

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

Ответ 8

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

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

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

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

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