ENUM (mysql)
sebbb
- datenbank
Mal ne frage zu ENUM()
Ich habe eine Spalte angelegt:
nummer ENUM('0','1','2') default '0' NOT NULL
Scheinbar gibt es außer den ENUM-Werten aber noch die Möglichkeit, die Spalte mit "gar keinen"-Werten zu füllen.
Beispiel:
UPDATE tabelle SET nummer = 'K' WHERE...
...führt zu dem Ergebnis, dass nummer keinen Wert hat, also auch keinen default.
Was mach ich falsch?
hi,
Scheinbar gibt es außer den ENUM-Werten aber noch die Möglichkeit, die Spalte mit "gar keinen"-Werten zu füllen.
Beispiel:
UPDATE tabelle SET nummer = 'K' WHERE......führt zu dem Ergebnis, dass nummer keinen Wert hat, also auch keinen default.
Was mach ich falsch?
Hm - du hast vielleicht die Doku nicht gelesen?
http://dev.mysql.com/doc/refman/4.1/en/enum.html
"If you insert an invalid value into an ENUM (that is, a string not present in the list of allowed values), the empty string is inserted instead as a special error value. This string can be distinguished from a “normal” empty string by the fact that this string has the numerical value 0. More about this later."
gruß,
wahsaga
Hä, ein error value kann ich nicht sehen. das feld ist bei einem invaliden wert einfach nur leer.
hi,
Hä, ein error value kann ich nicht sehen. das feld ist bei einem invaliden wert einfach nur leer.
Und was stand in dem gerade von mir Zitierten, wie genau dieser error value aussieht ...?
gruß,
wahsaga
Naja, der besagt, dass dieser error value den nummerischen wert 0 hat was aber nicht stimmt, denn ein select gibt keine 0 sondern einfach garnichts.
hi,
Naja, der besagt, dass dieser error value den nummerischen wert 0 hat was aber nicht stimmt, denn ein select gibt keine 0 sondern einfach garnichts.
Schau dir das Beispiel im Manual an, mit ENUM('one', 'two', 'three').
Wenn du da einen Datensatz mit 'two' einträgst - dann liefert dir SELECT auch wieder 'two' zurück.
Trägst du einen ungültigen Wert ein, wird dieser durch einen Leerstring ersetzt. SELECTierst du diesen Datensatz, bekommst du eben diesen Leerstring zurück.
Erst wenn du den Inhalt einer ENUM-Spalte in einem Kontext benutzt, der einen nummerischen Wert erfordert - dann wird auch ein solcher geliefert.
SELECT enum_feld + 10 FROM tabelle
Das würde dir jetzt für deinen ungültigen Wert 10 liefern.
SELECT * FROM tabelle WHERE enum_feld = 2
Auch das kannst du machen, dann schränkst du die Auswahl auf die Datensätze ein, die den zweiten definierten Wert im ENUM-Feld stehen haben.
gruß,
wahsaga
Hello,
SELECT * FROM tabelle WHERE enum_feld = 2
Auch das kannst du machen, dann schränkst du die Auswahl auf die Datensätze ein, die den zweiten definierten Wert im ENUM-Feld stehen haben.
Und eben hier haben ältre MySQL-Versionen einen Fehler gemacht.
Angenommen, es würde "gelb","blau","one","two","three","1","5"
als gültige Werte drinstehen und man fragte nach
SELECT * FROM tabelle WHERE enum_feld = "2"
dann bekam man als Antwort "blau" zurück.
Seit welcher Version ist der Fehler beseitigt, oder gibt es ihn noch?
Ich selber konnte bei der 5er Version noch nicht testen.
Das kommt aber noch
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom
Tach.
SELECT enum_feld + 10 FROM tabelle
Das würde dir jetzt für deinen ungültigen Wert 10 liefern.
Noch klarer wird es vielleicht mit ...
SELECT enum_feld, CAST(enum_feld AS UNSIGNED)
... welches den Integerwert liefert, durch den der Eintrag im ENUM intern repräsentiert wird.
Hello,
Ich habe eine Spalte angelegt:
nummer ENUM('0','1','2') default '0' NOT NULL
Das ist auf jeden Fall überprüfungswürdig.
Früher hatte ENUM die unangenehme Eigenschaft, den Index zurückzuliefern, wenn der Alphawert nicht gefunden wurde. Das führte immer zu Fehlern. Man konnte also nur Stings verwenden.
Und da war es auch möglich, einen Leerstring einzusetzen.
http://dev.mysql.com/doc/refman/5.0/en/enum.html
Da steht zwar inzwischen drin:
If you wish to use a number as an enumeration value, you must enclose it in quotes
Aber glauben mag ich das nicht einfach.
Harzliche Grüße vom Berg
http://www.annerschbarrich.de
Tom