sebbb: ENUM (mysql)

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?

  1. 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

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
    1. Hä, ein error value kann ich nicht sehen. das feld ist bei einem invaliden wert einfach nur leer.

      1. 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

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
        1. 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.

          1. 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

            --
            /voodoo.css:
            #GeorgeWBush { position:absolute; bottom:-6ft; }
            1. 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

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau

            2. 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.

              --
              Once is a mistake, twice is jazz.
  2. 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

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau