MySQL: NULL vs ""

Лучше ли использовать default null или default "" для текстовых полей в MySQL?

Почему?

Обновление: я знаю, что означает каждый из них. Мне интересно, что лучше использовать с учетом дискового пространства и производительности.

Обновление 2: Эй, ppl! Вопрос был "то, что лучше использовать", а не "то, что каждый означает" или "как их проверить"...

Ответ 1

Использовать значение по умолчанию null. В SQL null сильно отличается от пустой строки (""). Пустая строка означает, что значение было пустым; null означает, что значение не было установлено или было установлено значение null. Вы видите разные значения.

Различные значения и их различные способы использования - это то, почему важно использовать каждый из них по мере необходимости; объем пространства, потенциально сэкономленного с помощью default null, в отличие от default "" настолько мал, что он приближается к пренебрежимости; однако потенциальная ценность использования правильных значений по умолчанию в соответствии с требованиями соглашения довольно высока.

Ответ 2

Для таблиц MyISAM NULL создает дополнительный бит для каждого столбца NULLABLE (нулевой бит) для каждой строки. Если столбец не является NULLABLE, дополнительный бит информации никогда не нужен. Однако это дополняется 8-битными байтами, поэтому вы всегда получаете 1 + mod 8 байтов для подсчета столбцов NULLABLE. 1

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

В InnoDB, NULLS не занимают места: они просто не существуют в наборе данных. То же самое верно для пустой строки, поскольку смещения данных также не существуют. Единственное отличие состоит в том, что в NULL будет установлен бит NULL, а пустые строки - нет. 2

Когда данные на самом деле выложены на диске, NULL и "Взять ТОЧНО ТО ЖЕ САМОЕ ПРОСТРАНСТВО в обоих типах данных. Тем не менее, при поиске значения проверка NULL выполняется немного быстрее, чем проверка на '', поскольку вам не нужно учитывать длину данных в ваших вычислениях: вы проверяете только нулевой бит.

В результате NULL и '' пробелов в пространстве, NULL и '' не имеют НИКАКОГО РАЗМЕРНОГО ВОЗДЕЙСТВИЯ, если только в столбце не указано значение NULLable или нет. Если столбец NOT NULL, только в таблицах MyISAM вы увидите какую-либо разницу в форме (а затем, очевидно, значение NULL по умолчанию не может использоваться, поэтому спорный вопрос).

Реальный вопрос тогда сводится к интерпретации приложения столбцов "no value set here". Если "является допустимым значением, означающим" пользователь ничего не вводил здесь "или что-то вроде этого, тогда по умолчанию NULL является предпочтительным, поскольку вы хотите различать NULL и" " при вводе записи, в которой нет данных.

В общем случае, по умолчанию действительно полезно только для рефакторинга базы данных, когда новые значения должны вступать в силу для старых данных. В этом случае, опять же, выбор зависит от того, как интерпретируются данные приложения. Для некоторых старых данных NULL идеально подходит и наилучшим образом подходит (столбец не существовал до того, как он теперь имеет значение NULL!). Для других "более подходящим" (часто, когда запросы используют SELECT * и NULL, вызывают проблемы с сбоем).

В ULTRA-GENERAL TERMS (и с философской точки зрения) столбцы NULL по умолчанию для столбцов NULLABLE предпочтительнее, поскольку он дает лучшую семантическую интерпретацию "No Value Specified".

1 [http://forge.mysql.com/wiki/MySQL_Internals_MyISAM]

2 [http://forge.mysql.com/wiki/MySQL_Internals_InnoDB]

Ответ 3

От Высокопроизводительная MySQL, 3-е издание

Избегайте, если возможно, NULL.Множество таблиц включает столбцы с нулевым значением, даже если приложение не требуется для хранения NULL (отсутствие значения), просто потому, что он по умолчанию. Его обычно лучше указать столбцы как NOT NULL, если вы не намерены хранить в них NULL. Его сложнее для MySQL оптимизировать запросы, которые относятся к столбцам с возможностью NULL, потому что они усложняют индексы, статистику индексов и сравнение значений. Столбец с нулевым значением использует больше места для хранения и требует специальной обработки внутри MySQL. Когда индекс с нулевым значением индексируется, для него требуется дополнительный байт на запись и даже может привести к индексу фиксированного размера (например, индексу на одном целочисленном столбце) для преобразования в переменный размер в MyISAM. Улучшение производительности от изменения столбцов NULL до NOT NULL обычно маленький, поэтому не делайте приоритетом поиск и изменение их по существующей схеме если вы не знаете, что они вызывают проблемы. Однако, если вы планируете индексировать столбцы, избегайте, если возможно, их обнуляемости. Конечно, есть исключения. Например, стоит упомянуть, что InnoDB хранит NULL с одним битом, поэтому он может быть довольно экономичным для малонаселенных данные. Однако это не относится к MyISAM.

Ответ 4

Многие люди отвечают на вопрос о том, в чем разница между null и '', но ОП запросил, что занимает меньше места/быстрее, поэтому здесь мой удар:

Ответ заключается в том, что это зависит. Если ваше поле является char(10), оно всегда будет принимать 10 байтов, если не установлено значение null, и поэтому null займет меньше места. Минута по строке за строкой, но над миллионами и миллионами строк это может сложить. Я считаю, что даже varchar(10) будет хранить один байт (\0) как пустую строку, поэтому снова это может быть связано с огромными таблицами.

С точки зрения производительности в запросах, null теоретически быстрее тестируется, но я не видел возможности найти какую-либо заметную разницу в хорошо проиндексированной таблице. Имейте в виду, что вам, возможно, придется преобразовать null в '' на стороне приложения, если это желаемый доход. Опять же, строка за строкой, разница минута, но она может потенциально складываться.

В целом это микро-оптимизация, поэтому она сводится к предпочтению. Мое предпочтение заключается в использовании null, потому что мне нравится знать, что там нет значения, и не догадываться, если это пустая строка ('') или пучок пробелов (' '). null является явным по своей природе. '' нет. Поэтому я иду с null, потому что я являюсь явным видом парня.

Ответ 5

Я узнал, что NULL vs "" незначителен с точки зрения дискового пространства и производительности.

Единственная истинная причина, по которой я могу лично увидеть использование NULL над '', - это когда у вас есть поле, помеченное как UNIQUE, но ему нужно разрешить несколько "пустых" столбцов.

Например, столбец электронной почты в моей таблице пользователя заполняется только в том случае, если у кого-то действительно есть адрес электронной почты. Любой без адреса электронной почты получает NULL. Я все же могу сделать это поле уникальным, потому что NULL не считается значением, тогда как пустая строка ''.

Ответ 6

Используйте все, что имеет смысл. NULL означает "no value available/defined", "" означает "пустая строка".

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

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

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

Ответ 7

Я предпочитаю null, когда он семантически корректен. Если имеется поле адреса, и пользователь не заполнил его, я даю ему "". Однако, если в атрибуте адреса в таблице пользователей я еще не предложил пользователю заполнить его, я даю ему NULL.

Я сомневаюсь (но не могу проверить), что NULL и "" имеют большое значение.

Ответ 8

"" похож на пустой ящик... null не похож на поле.

Это сложная концепция, которую нужно понять сначала, но, как здесь ясно сказано, есть большая разница.

Ответ 9

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

Иногда пустая строка - это то, что вам нужно в качестве значения данных, но она почти никогда не будет значением по умолчанию.

Ответ 10

NULL означает, что "нет значения", и особенно рассматривается RDBMS в отношении предложений и объединений.

"означает" пустая строка" и не обрабатывается особенно.

Это зависит от того, что представляет текст и как он будет использоваться в запросах.

Например, у вас может быть вопросник с некоторыми обязательными вопросами и некоторыми необязательными вопросами.

  • Отклоненные необязательные вопросы должны иметь NULL в соответствующем столбце.
  • Обязательные вопросы должны иметь пустую строку по умолчанию, потому что им нужно ответить. (Конечно, в реальном приложении вы бы сказали пользователю что-то ввести, но я надеюсь, что вы поняли эту идею).

Ответ 11

'' = '' дает TRUE, который удовлетворяет условию WHERE

NULL = NULL дает NULL, который не удовлетворяет условию WHERE

Что лучше использовать, зависит от того, какой результат вы хотите получить.

Если ваши значения по умолчанию равны NULL, нет таких запросов:

SELECT  *
FROM    mytable
WHERE   col1 = ?

когда-либо вернет эти значения, даже если вы передадите NULL для связанного параметра, а этот запрос:

SELECT  *
FROM    mytable
WHERE   col1 = ''

вернет вам строки, которые вы установили в пустую строку.

Это верно для MySQL, но не для Oracle, который не различает пустую строку и NULL.

В Oracle последний запрос никогда ничего не вернет.

Ответ 12

Используйте "". Это требует меньше усилий для программирования, если вы можете утверждать, что столбцы не равны нулю. Разница в пространстве между ними тривиальна.