NULL в значениях запроса, приводящих к 0,00 в MySQL - PullRequest
3 голосов
/ 29 октября 2010

У меня есть запрос, который написан динамически (OO PHP через Joomla), чтобы вставить некоторые значения в базу данных MySQL. Форма, которую заполняет пользователь, имеет поле для суммы в долларах, и если они оставят это поле пустым, я хочу, чтобы значение, поступающее в систему, было равно NULL. Я записал запрос в журнал ошибок во время его работы; Вот как выглядит запрос:

INSERT INTO arrc_Voucher 
  (VoucherNbr,securityCode,sequentialNumber, TypeFlag, CreateDT, ActivatedDT, BalanceInit,  BalanceCurrent, clientName)     
VALUES
  ('6032100199108006', '99108006','12','V','2010-10-29 12:50:01','NULL','NULL','NULL','')

Когда я смотрю в таблицу базы данных, хотя ActivatedDT правильно установлен в NULL, BalanceInit и BalanceCurrent оба равны 0,00. Поле ActivatedDT является датой и временем, в то время как два других являются десятичными (18,2), и все три установлены в структуре таблицы как значение по умолчанию NULL.

Если я выполню запрос, подобный этому:

UPDATE arrc_Voucher 
   SET BalanceInit = null 
WHERE BalanceInit like "0%"

... он устанавливает значение в null, так почему же первоначальный запрос вставки не делает этого? Это потому что нуль в кавычках? И если да, то почему он настроен правильно для ActivatedDT?

Ответы [ 3 ]

6 голосов
/ 29 октября 2010

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

Что касается того, почему ActivatedDT работает, я предполагаю, что это поле даты. Неспособность преобразовать строку в дату обычно приводит к установке значения 0 (которое форматируется как что-то вроде '1969-12-31'), но если у вас включен режим NO_ZERO_DATE тогда вместо него будет установлено значение NULL.

Если вы хотите, чтобы MySQL выдавал ошибку в таких случаях, когда передаются недопустимые значения, вы можете установить STRICT_ALL_TABLES или STRICT_TRANS_TABLES (убедитесь, что вы прочтите часть о разнице между ними) или об одном из режимов эмуляции, например TRADITIONAL.

Вы можете попробовать это с помощью команды SET sql_mode='TRADITIONAL' или добавив sql-mode="TRADITIONAL" в my.cnf.

3 голосов
/ 29 октября 2010

Когда вы вставляете NULL в базу данных MySQL, вы не можете вставить его в кавычки. Он пытается вставить varchar 'NULL'. Если бы ваша идея сработала, вы бы никогда не смогли вставить фактическое слово NULL в БД.

Удалите одинарные кавычки, если хотите вставить NULL.

2 голосов
/ 29 октября 2010

Вы устанавливаете поля не на NULL, а на строки ('NULL').

...