Пустая строка, вставляющая ноль, а не нуль - PullRequest
9 голосов
/ 03 августа 2011

Моя инструкция вставки выглядит следующим образом:

INSERT INTO foo (bar) VALUES ('');

Поле bar было создано так:

bar INT(11)
    COLLATION: (NULL)
    NULL: YES
    DEFAULT: (NULL)

Версия MySQL: 5.1.

Следуетпустую строку вставить NULL?Я не уверен, почему в таблице хранится ноль (0).

Ответы [ 4 ]

12 голосов
/ 03 августа 2011

MySQL по умолчанию пытается привести недопустимые значения для столбца к правильному типу.Здесь пустая строка '' имеет тип string, который не является ни целым числом, ни NULL.Я предлагаю предпринять следующие шаги:

  1. Измените запрос на следующий: INSERT INTO foo (bar) VALUES (NULL);
  2. Включить строгий режим в MySQL.Это предотвращает столько неожиданных преобразований типов и значений.Вы увидите больше сообщений об ошибках, когда попытаетесь сделать что-то, чего MySQL не ожидает, что поможет вам быстрее находить проблемы.
6 голосов
/ 03 августа 2011

Вы не вставляете NULL в таблицу;Вы вставляете пустую строку (которая, по-видимому, отображается в ноль как int).Помните, что NULL является отдельным значением в SQL;NULL != ''.Указывая любое значение (кроме NULL), вы не вставляете NULL.Значение по умолчанию используется, только если вы не указали значение;в вашем примере вы указали строковое значение для целочисленного столбца.

3 голосов
/ 03 августа 2011

Почему это должно быть NULL?Вы предоставляете значение, которое имеет целочисленное представление: пустые строки преобразуются в INT 0.

Только если вы не предоставите любое значение , будет по умолчанию.

2 голосов
/ 03 августа 2011

Способ сделать это - не заполнять поле вообще. заполняйте только те, которые действительно должны иметь значение.

...