MySQL gibt einen leeren Wert ein

8

Ich versuche zu verstehen, wie enums in mysql verwendet werden könnten. Wenn ich etwas in enum-Feld einfüge, das sich außerhalb des Enum-Typs befindet, fügt mysql eine leere Zeichenfolge (mit dem Wert 0) ein.

  • Frucht ENUM ("APPLE", "BANANA", "PFIRSICH");
  • EINFÜGEN ... fruit = 'BANNANA'

Einfache Rechtschreibfehler und MySQL fügt leere Werte ein, bricht die Datenbankintegrität und macht enums extrem nutzlos.

CHECK-Einschränkungen könnten hier helfen, aber MySQL unterstützt sie nicht (ziemlich lustig für "beliebteste" Datenbank in 2011)

Der einzige Weg, den ich sehe, ist, den Trigger zu schreiben, um eine leere Zeichenfolge zu verhindern, aber es ist zu viel Arbeit, um einen Trigger für einen so einfachen Fall zu schreiben.

Gibt es eine Möglichkeit, das MySQL-Verhalten "Leerstring" für Enums zu deaktivieren?

Danke

    
user996142 17.11.2011, 21:29
quelle

2 Antworten

8

Gemäß der Dokumentation:

Wenn Sie einen ungültigen Wert in eine ENUM einsetzen (das heißt, eine Zeichenfolge nicht in der Liste der zulässigen Werte), wird die leere Zeichenfolge statt als Sonderfehlerwert eingefügt. Diese Zeichenfolge kann durch die Tatsache, von einem „normalen“ leeren String unterschieden werden, dass diese Zeichenfolge hat den numerischen Wert 0

Auf Nebenbei bemerkt, ich ( und andere ) empfehlen, dass Sie enums vermeiden, da sie nicht sehr effizient sind.

Wenn Sie wirklich Enums benötigen, sollten Sie den strikten Modus verwenden. Der strikte Modus wird zumindest einen Fehler ausgeben, wenn Sie versuchen, einen ungültigen Wert in eine ENUM-Spalte einzufügen. Andernfalls wird nur eine Warnung ausgelöst und der Wert wird einfach auf einen leeren String gesetzt ‚‘ (bezogen intern als 0). Hinweis: Fehler können weiterhin im strikten Modus unterdrückt werden, wenn Sie IGNORE verwenden.

Hier finden Sie einen Link zur Dokumentation zum Einstellen Ihres MySQL Server-Modus .

Glückliche Kodierung!

Update: Nicks Antwort ist eine Möglichkeit, Ihren Server im strikten Modus einzurichten. Der TRADITIONAL-Modus entspricht STRICT_TRANS_TABLES, STRICT_ALL_TABLES, NO_ZERO_IN_DATE, NO_ZERO_DATE, ERROR_FOR_DIVISION_BY_ZERO und NO_AUTO_CREATE_USER. Denken Sie also daran, dass für andere Datentypen, wie z. B. DATE, eine zusätzliche Datenvalidierung durchgeführt wird.

    
stefgosselin 17.11.2011 21:38
quelle
4

Sehen Sie sich die SQL-Modi an

%Vor%     
Nicola Cossu 17.11.2011 21:38
quelle

Tags und Links