3 Stimmen

NULL in Abfragewerten führt zu 0,00 in MySQL

Ich habe eine Abfrage, die dynamisch (OO PHP über Joomla) geschrieben wird, um einige Werte in eine MySQL-Datenbank einzufügen. Das Formular, das ein Benutzer ausfüllt, hat ein Feld für den Dollar-Betrag, und wenn sie das leer lassen, möchte ich, dass der Wert, der in das System geht, NULL ist. Ich habe die Abfrage in das Fehlerprotokoll geschrieben, während sie ausgeführt wird; so sieht die Abfrage aus:

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','')

Wenn ich jedoch in der Datenbanktabelle nachsehe, ist ActivatedDT zwar korrekt auf NULL gesetzt, aber BalanceInit und BalanceCurrent sind beide 0,00. Das Feld ActivatedDT ist ein Datetime-Feld, während die beiden anderen Felder decimal(18,2) sind, und alle drei sind in der Tabellenstruktur auf den Standardwert NULL eingestellt.

Wenn ich eine Abfrage wie diese ausführe:

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

...es setzt den Wert auf Null, warum also tut die anfängliche Einfügeabfrage dies nicht? Liegt es daran, dass null in Anführungszeichen steht? Und wenn ja, warum wird er für ActivatedDT korrekt gesetzt?

6voto

Brad Mace Punkte 26337

Entfernen Sie die Anführungszeichen um NULL . Was tatsächlich passiert, ist, dass es versucht, die Zeichenfolge einzufügen 'NULL' als Zahl, und da sie nicht in eine Zahl umgewandelt werden kann, wird der Standardwert 0 .

Ich vermute, dass es sich bei ActivatedDT um ein Datumsfeld handelt, weshalb es funktioniert. Wenn eine Zeichenkette nicht in ein Datum umgewandelt werden kann, wird der Wert normalerweise auf 0 (die als etwas wie '1969-12-31' formatiert wird), aber wenn Sie NO_ZERO_DATE Modus aktiviert ist, dann würde er auf NULL stattdessen.

Wenn Sie m?chten, dass MySQL in F?llen wie diesem einen Fehler ausl?st, wenn ung?ltige Werte ?bergeben werden, k?nnen Sie die STRICT_ALL_TABLES o STRICT_TRANS_TABLES (vergewissern Sie sich, dass Sie den Teil über den Unterschied zwischen ihnen gelesen haben) oder einen der Emulationsmodi, wie TRADITIONAL .

Sie können dies mit dem Befehl SET sql_mode='TRADITIONAL' oder durch Hinzufügen von sql-mode="TRADITIONAL" en my.cnf .

3voto

Scott Punkte 2033

Wenn Sie NULL in eine MySQL-Datenbank einfügen, können Sie es nicht mit Anführungszeichen einfügen. Es wird versucht, den varchar 'NULL' einzufügen. Wenn Ihre Idee funktionieren würde, könnten Sie niemals das tatsächliche Wort NULL in die DB einfügen.

Entfernen Sie die einfachen Anführungszeichen, wenn Sie NULL einfügen wollen.

2voto

Klaus Byskov Pedersen Punkte 111081

Sie setzen die Felder nicht auf NULL sondern auf Zeichenketten ( 'NULL' ).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X