Ich habe eine MySQL-Spalte auf "NOT NULL" gesetzt, aber trotzdem kann ich einen leeren Wert einfügen

7

In MySQL habe ich eine Tabelle mit Spalte1 als NICHT NULL:

%Vor%

Ich kann immer noch einen leeren Wert wie folgt einfügen:

%Vor%

Wie kann ich der MySQL-Spalte auch erlauben, Leerzeichen zu verbieten?

    
zac1987 31.08.2011, 23:40
quelle

5 Antworten

8

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.

    
MatBailie 31.08.2011, 23:46
quelle
8

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>     

Dan J 31.08.2011 23:45
quelle
3

Wie Martin erwähnt, hängt das von Ihrem RDBMS ab. Oracle behandelt leere Zeichenfolgen als NULL, andere nicht. Siehe hierzu SO Post .

    
JW8 31.08.2011 23:43
quelle
3

MySQL, wie man eine leere Zeichenfolge verbietet:

  1. Erstellen Sie Ihre Tabelle:

    %Vor%
  2. Erstellen Sie Ihren Trigger 'vor dem Einfügen', um nach Leerzeichen zu suchen und zu verbieten.

    %Vor%
  3. 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.

    
Eric Leschinski 18.03.2014 19:27
quelle
0

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.

    
TVNshack 07.10.2013 12:58
quelle

Tags und Links