MySQL, лучше вставить NULL или пустую строку?

У меня есть форма на сайт, который имеет много разных полей. Некоторые поля являются необязательными, а некоторые-обязательными. В моей БД у меня есть таблица, которая содержит все эти значения, лучше ли вставлять нулевое значение или пустую строку в столбцы БД, где пользователь не помещал никаких данных?

6 ответов


С помощью NULL вы можете различать "нет данных "и"пустые данные".

еще несколько отличий:

  • A LENGTH of NULL и NULL, a LENGTH пустая строка 0.

  • NULLs сортируются перед пустыми строками.

  • COUNT(message) будем считать пустые строки, но не NULLs

  • вы можете искать пустую строку использование связанной переменной, но не для NULL. Этот запрос:

    SELECT  *
    FROM    mytable 
    WHERE   mytext = ?
    

    никогда не будет соответствовать NULL на mytext, любое значение, которое вы передаете от клиента. Чтобы соответствовать NULLs, вам придется использовать другой запрос:

    SELECT  *
    FROM    mytable 
    WHERE   mytext IS NULL
    

одна вещь, чтобы рассмотреть, если вы когда-нибудь план переключения баз данных, это Oracle не поддерживает пустые строки. Они автоматически преобразуются в NULL, и вы не можете запросить их с помощью таких предложений, как WHERE somefield = '' .


следует иметь в виду, что NULL может сделать ваши кодовые пути намного сложнее. В Python, например, большинство адаптеров базы данных / ORMs map NULL to None.

Итак, такие вещи, как:

print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow

может привести к "Hello, None Joe Doe!"Чтобы избежать этого, вам нужно что-то вроде этого кода:

if databaserow.title:
    print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow
else:
    print "Hello, %(firstname) %(lastname)!" % databaserow

что может сделать вещи гораздо более сложными.


лучше вставить NULL для согласованности в вашей базе данных в MySQL. Внешние ключи могут храниться как NULL но не как пустые строки.

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

Читайте также: может ли внешний ключ быть нулевым и / или дубликатом?


Я не знаю, какая лучшая практика будет здесь, но я обычно ошибаюсь в пользу null, если вы не хотите, чтобы null означал что-то отличное от пустой строки, и ввод пользователя соответствует вашему определению пустой строки.

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

О, и имейте в виду, что если столбец равен null, запись с меньшей вероятностью появится практически в любом запросе, который выбирает (имеет предложение where, в терминах SQL) на основе этого столбца, если выбор не для нулевого столбца, конечно.


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

COLUMNS IN A UNIQUE INDEX:
(event_type_id, event_title, date, location, url)

EXAMPLE 1:
(1, 'BBQ', '2018-07-27', null, null)
(1, 'BBQ', '2018-07-27', null, null) // allowed and duplicated.

EXAMPLE 2:
(1, 'BBQ', '2018-07-27', '', '')
(1, 'BBQ', '2018-07-27', '', '') // NOT allowed as it's duplicated.

вот некоторые коды:

CREATE TABLE `test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `event_id` int(11) DEFAULT NULL,
  `event_title` varchar(50) DEFAULT NULL,
  `date` date DEFAULT NULL,
  `location` varchar(50) DEFAULT NULL,
  `url` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `event_id` (`event_id`,`event_title`,`date`,`location`,`url`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

теперь вставьте это, чтобы увидеть, что это позволит дублированные строки:

INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`, 
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-27', NULL, NULL);

INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`, 
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-27', NULL, NULL);

теперь вставьте это и убедитесь, что это не разрешено:

INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`, 
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-28', '', '');

INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`, 
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-28', '', '');

Итак, здесь нет правильного или неправильного. Это до вас решить, что лучше всего работает с вашими бизнес-правилами.