Почему ENUM ("0", "1") сохраняется как пустая строка в Mysql? - PullRequest
2 голосов
/ 27 ноября 2010

У меня есть таблица MYSQL с полем ENUM с именем " offset " и некоторыми другими столбцами.Поле определяется как:

ENUM (0,1) , может быть NULL , предопределенное значение NULL

Теперь у меня два сервера.Рабочий сервер и сервер разработки, а также тот же сценарий PHP, который использовался для создания и обновления базы данных.

Первый шаг : приложение создает запись без пропуска " offset"в запросе CREATE.

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

Автоматизированный построитель запросов просто считывает все поля, переданные в массиве, и создает строку UPDATE.

В обеих системах я получаю этот массив:

$values = array(... 'offset' => null);

и преобразую его в этот же запрос, передавая значения в mysql_real_escape_string:

UPDATE MyTable SET values..., `offset` = '' WHERE id = '10';

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

Из phpmyadmin при созданиистрока с первым шагом, показывает NULL в поле смещения.После сохранения поля в системе, которое не выдает ошибок, отображается пустая строка.

Обе системы используют MySQL 5, но в Linux используется версия 5.0.51, а в Windows - 5.0.37 для разработки.

Вопросы:

Почему одна система выдает ошибку, а другая сохраняет поле?Разница в конфигурации?

Почему, когда я сохраняю поле с перечислением "0" или "1", оно сохраняет "", а не NULL?

Ответы [ 3 ]

3 голосов
/ 27 ноября 2010

ответ Страгера кажется хорошим объяснением того, почему ваш код ведет себя по-разному в двух средах.

Хотя проблема в другом месте. Если вы хотите установить значение NULL в запросе, который вы должны использовать, используйте именно NULL, но вы используете mysql_real_escape_string (), результатом которого всегда является строка:

$ php -r 'var_dump(mysql_real_escape_string(null));'
string(0) ""

Вы должны обращаться с этим по-другому. Например:

$value = null
$escaped_value = is_null($value) ? "NULL" : mysql_real_escape_string($value);
var_dump($escaped_value);
// NULL

Некоторые слои БД, такие как PDO, прекрасно справляются с этим.

2 голосов
/ 27 ноября 2010

Почему одна система выдает ошибку, а другая сохраняет поле? Разница в конфигурации?

Возможно. Смотри ниже.

Почему, когда я сохраняю поле с перечислением «0» или «1», оно сохраняет «», а не NULL?

Согласно документации MySQL ENUM :

Значением может быть также пустая строка ('') или NULL при определенных обстоятельствах:

  • Если вы вставите недопустимое значение в ENUM (то есть строку, отсутствующую в списке допустимых значений), вместо нее будет добавлена ​​пустая строка в качестве специального значения ошибки . Эту строку можно отличить от «нормальной» пустой строки тем, что эта строка имеет числовое значение 0. ...

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

(выделение добавлено.)

0 голосов
/ 27 ноября 2010

Если вы хотите, чтобы оно было NULL, почему бы вам не сделать это в первую очередь:

UPDATE MyTable SET values..., `offset` = NULL WHERE id = 10;
...