Der SET-Typ
Ein SET ist ein Zeichenketten-Objekt, das 0 oder mehr Werte haben kann, wovon jedes aus einer
Auflistung zulässiger Werte stammen muss, die bei der Tabellenerzeugung festgelegt wurden. SETSpaltenwerte,
die aus mehrfachen SET-Elementen bestehen, werden angegeben, indem die
Elemente durch Kommas (‘,’) getrennt werden. Daraus ergibt sich, dass SET-Elemente selbst keine
Kommas enthalten dürfen.
Eine Spalte beispielsweise, die als SET("eins", "zwei") NOT NULL festgelegt wurde, kann
folgende Werte haben:
""
"eins"
"zwei"
"eins,zwei"
MySQL-Sprachreferenz
Eine SET kann maximal 64 unterschiedliche Elemente besitzen.
MySQL speichert SET-Werte numerisch, wobei das niedrigste Bit in der Reihenfolge der
gespeicherten Werte dem ersten SET-Element entspricht. Wenn Sie einen SET-Wert in einem
numerischen Zusammenhang abrufen, hat der abgerufene Werte Bits gesetzt, die den SETElementen,
aus denen sich der Spaltenwert zusammensetzt, entspricht. Beispielsweise können Sie
numerische Werte aus einer SET-Spalte wie folgt abrufen:
mysql> SELECT set_spalte+0 FROM tabelle;
Wenn in einer SET-Spalte eine Zahl gespeichert wird, legen die Bits, die in der binären Darstellung
der Zahl gesetzt sind, die SET-Elemente im Spaltenwert fest. Angenommen, eine Spalte ist als
SET("a","b","c","d") festgelegt, dann haben die Elemente folgende Bitwerte:
SET Element Dezimalwert Binärwert
a 1 0001
b 2 0010
c 4 0100
d 8 1000
Wenn Sie dieser Spalte einen Wert von 9 zuweisen, ist das binär 1001. Daher werden der erste und
der vierte SET-Wert, die Elemente "a" und "d", ausgewählt, und der Ergebniswert ist "a,d".
Bei einem Wert, der mehr als ein SET-Element enthält, spielt es keine Rolle, in welcher
Reihenfolge die Elemente aufgelistet sind, wenn Sie den Wert einfügen. Es spielt ebenfalls keine
Rolle, wie oft ein gegebenes Element im Wert aufgelistet ist. Wenn der Wert später abgerufen wird,
erscheint jedes Element im Wert einmal, wobei die Elemente in der Reihenfolge erscheinen, in der
sie bei der Tabellenerzeugung festgelegt wurden. Wenn eine Spalte beispielsweise als
SET("a","b","c","d") festgelegt ist, erscheinen "a,d", "d,a" und "d,a,a,d,d" als
"a,d", wenn sie abgerufen werden.
SET-Werte werden numerisch sortiert. NULL-Werte werden vor Nicht-NULL-SET-Werten
einsortiert.
Normalerweise führt man SELECT auf eine SET-Spalte mit dem LIKE-Operator oder der
FIND_IN_SET()-Funktion aus:
mysql> SELECT * FROM tabelle WHERE set_spalte LIKE '%wert%';
mysql> SELECT * FROM tabelle WHERE FIND_IN_SET('wert',set_spalte)>0;
Aber auch folgendes funktioniert:
mysql> SELECT * FROM tabelle WHERE set_spalte = 'wert1,wert2';
mysql> SELECT * FROM tabelle WHERE set_spalte & 1;
Das erste dieser Statements sucht nach einer exakten Übereinstimmung, das zweite sucht Werte, die
das erste SET-Element enthalten.
Wenn Sie alle möglichen Werte einer SET-Spalte erhalten wollen, benutzen Sie: SHOW COLUMNS
FROM tabelle LIKE set_spalte und gehen die SET-Definition in der zweiten Spalte
durch.