EMPTY STRINGS
In ORACLE wird eine leere Zeichenfolge verwendet, um für NULL zu stehen. In fast allen anderen Fällen ist eine leere Zeichenfolge jedoch immer noch eine Zeichenfolge und daher nicht NULL.
INTS
In Ihrem Fall fügen Sie tatsächlich STRINGS in eine INT-Spalte ein. Dies erzwingt eine implizite CAST-Operation.
Wenn Ihr RDBMS die Zeichenfolge ''
in eine INT konvertiert, muss sie den Wert 0 erhalten. Da 0 nicht NULL ist, wird diese eingefügt.
Ein gültiger Test wäre:
%Vor%
BEARBEITEN
Entschuldigung, ich habe Ihre Frage nur halb gelesen. Sie fragen auch, wie Sie verhindern können, dass ''
eingefügt wird.
Ihr erstes Problem besteht darin, dass Sie STRINGS einfügen und die Tabelle mit INT-Feldern definiert ist. Sie können Einschränkungen für die Daten festlegen, die eingefügt werden, aber diese Einschränkungen wenden den Wert nach einer Konvertierung in eine INT an. Wenn Sie nicht verhindern möchten, dass der Wert 0
ebenfalls eingefügt wird, können Sie nichts tun, um dieses Szenario zu verhindern.
Sie sollten besser darauf eingehen, warum Sie überhaupt Strings einfügen. Sie können eine gespeicherte Prozedur verwenden, die die Zeichenfolgen vor dem Konvertieren in INTs übernimmt und überprüft und sie dann einfügt. Oder, noch besser, Sie könnten die Prüfungen in Ihrer Client-Anwendung durchführen.
Eine technisch verfügbare Option besteht darin, die Felder CHAR-Felder zu erstellen und dann eine Einschränkung für die Felder festzulegen, um zu verhindern, dass ''
eingefügt wird. Ich würde stark dagegen empfehlen.
Sie fügen eine leere Zeichenfolge ein, nicht NULL
. Die Einschränkung gilt nur für NULL-Werte, und es scheint, dass Ihre Datenbank leere Strings nicht auf NULL umsetzt, wenn sie sie in INT konvertiert (was die zusätzliche Frage aufwirft, warum Sie String-Literale in INT-Spalten einfügen) / p>
Erstellen Sie Ihre Tabelle:
%Vor%Erstellen Sie Ihren Trigger 'vor dem Einfügen', um nach Leerzeichen zu suchen und zu verbieten.
%Vor%Versuchen Sie, null und Leerzeichen in Ihre Spalte einzufügen:
%Vor%Schließlich grummle zu selbst und schmatze die nächste Person, die für die Auswahl von mysql über postgresql verantwortlich war.
NULL ist nicht gleich leer. In MySQL gibt es ein zusätzliches Byte mit jedem Spalteneintrag, um die Information "ist Null" zu enthalten. Um Platz zu sparen, wird eine Spalte oft als "nicht null" definiert, um dieses zusätzliche Byte zu sparen, wenn der Nullstatus dem Datenmodell nichts hinzufügt.