Может ли тип MySQL INT быть ненулевым NULL - PullRequest
10 голосов
/ 06 февраля 2012

Я создаю базу данных MySQL, которая состоит из еженедельных наборов данных, начиная с прошлого десятилетия.Существуют некоторые точки данных, которые существуют для последних записей, но которые не отслеживались в некоторых старых наборах данных.Все поля, о которых идет речь, содержат целочисленные значения, и «0» - это абсолютно правильное (и частое) значение для записей, которые отслеживали точки данных.Мне нужно уметь различать нулевое значение и несуществующие данные.Поэтому мне нужно выяснить, возможно ли сохранить NULL, который не представлен как '0' (читай: BLANK CELL) для типа INT.Однако значения NULL, передаваемые в БД, представлены как '0' (по крайней мере, они в phpMyAdmin), есть ли способ изменить это?

Спасибо за вашу помощь.

Ответы [ 3 ]

13 голосов
/ 06 февраля 2012

Вы можете установить значение в NULL. INSERT INTO table (INT_COLUMN) VALUES (NULL) является допустимым SQL (с INT_COLUMN, являющимся пустым столбцом int).

9 голосов
/ 06 февраля 2012

Ответ «да» - у вас могут быть обнуляемые столбцы типа int. Но стоит ли?

Слишком часто null неправильно используют и неправильно понимают. В базах данных SQL null означает «неизвестно». В вашей ситуации использование null идеально, так что «да - вы должны»

Бывают случаи, когда вы хотите использовать определенное значение для «ноль», например, -1 для количества. Этот подход действителен и используется для упрощения кода приложения и SQL, потому что работа с нулями в запросах - это боль в заднице:

  • Вы должны использовать специальный синтаксис "IS NULL"
  • Любой список, содержащий ноль, никогда не будет совпадать с что-либо , например, WHERE NAME IN (SELECT COL1 FROM SOMETABLE) никогда не будет работать, если какое-либо из выбранных значений будет нулевым
  • Нуль не равен ничему другому, даже другому нулю
  • В строгом (например, Java) коде приложения у вас есть проверка, что значение равно нулю, или вы получите исключение NullPointerException. Использование фактического значения позволяет избежать этого
2 голосов
/ 06 февраля 2012

Да, убедитесь, что в вашей таблице разрешены значения NULL в рассматриваемом столбце. Смотрите самый простой пример ниже:

DROP TABLE IF EXISTS testTable;
CREATE TABLE `testTable` (
  `id` int(11) unsigned NOT NULL auto_increment,
  `data` int(11) default NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1
;

INSERT INTO testTable VALUES
(NULL, 100),
(NULL, 200),
(NULL, NULL),
(NULL, 400);

SELECT * FROM testTable;

Выбор будет иметь следующий результат:

+----+------+
| id | data |
+----+------+
|  1 |  100 |
|  2 |  200 |
|  3 | NULL |
|  4 |  400 |
+----+------+
...