Der Datentyp SET
(Menge) ist ein
String-Objekt, das null oder mehr Werte haben kann. Alle diese
Werte entstammen einer Liste zulässiger Werte, die beim
Erstellen der Tabelle angegeben werden. Bei
SET
-Spaltenwerten, die mehrere Mitglieder der
Menge umfassen, werden die Mitgliedswerte durch Kommata
(‘,
’) getrennt angegeben. Hieraus
ergibt sich, dass SET
-Mitgliedswerte
ihrerseits keine Kommata enthalten sollten.
Eine Spalte, die als SET('one', 'two') NOT
NULL
definiert ist, kann jeden der folgenden Werte
annehmen:
'' 'one' 'two' 'one,two'
Ein SET
kann maximal 64 Mitgliedswerte
umfassen.
Beim Erstellen der Tabelle werden bei
SET
-Mitgliedswerten am Ende stehende
Leerzeichen in der Tabellendefinition automatisch entfernt.
Beim Abrufen werden Werte, die in einer
SET
-Spalte gespeichert sind, in der
Groß-/Kleinschreibung angezeigt, die bei der Spaltendefinition
verwendet wurde. Beachten Sie, dass
SET
-Spalten ein Zeichensatz und eine
Sortierung zugewiesen werden können. Bei binären Sortierungen
oder solchen, bei denen die Groß-/Kleinschreibung unterschieden
wird, wird die Schreibweise beim Zuweisen von Werten zur Spalte
berücksichtigt.
MySQL speichert SET
-Werte numerisch, wobei
das niederwertige Bit des gespeicherten Werts dem ersten
Mitgliedswert der Menge entspricht. Wenn Sie einen
SET
-Wert in einem numerischen Kontext
abrufen, sind die Bits dieses Werts entsprechend den
Mitgliedswerten der Menge gesetzt, die den Spaltenwert bilden.
So können Sie beispielsweise numerische Werte wie folgt aus
einer SET
-Spalte abrufen:
mysql> SELECT set_col
+0 FROM tbl_name
;
Wenn eine Zahl in einer SET
-Spalte
gespeichert wird, bestimmen die Bits, die in der Binärform der
Zahl gesetzt sind, die im Spaltenwert vorhandenen Mitglieder.
Bei einer Spalte, die als
SET('a','b','c','d')
definiert ist, haben die
Mitglieder die folgenden Dezimal- und Binärwerte:
SET Mitgliedswert
|
Dezimalwert | Binärwert |
'a' |
1 |
0001 |
'b' |
2 |
0010 |
'c' |
4 |
0100 |
'd' |
8 |
1000 |
Wenn Sie dieser Spalte den Wert 9
zuweisen,
entspricht dies dem Binärwert 1001
, d. h.,
der erste und der vierte SET
-Mitgliedswert
('a'
und 'd'
) werden
ausgewählt. Das Ergebnis lautet also 'a,d'
.
Bei einem Wert, der mehr als ein SET
-Element
enthält, spielt es keine Rolle, in welcher Reihenfolge die
Elemente beim Einfügen des Werts aufgeführt sind. Ebenso wenig
ist relevant, wie häufig ein gegebenes Element in der Liste
auftaucht. Wenn der Wert später abgerufen wird, erscheint jedes
Element des Werts genau einmal in der Liste, und diese ist in
der Reihenfolge sortiert, in der die Mitglieder bei Erstellung
der Tabelle aufgeführt wurden. Nehmen wir beispielsweise einmal
an, eine Spalte sei als SET('a','b','c','d')
definiert:
mysql> CREATE TABLE myset (col SET('a', 'b', 'c', 'd'));
Nun fügen Sie die Werte 'a,d'
,
'd,a'
, 'a,d,d'
,
'a,d,a'
und 'd,a,d'
ein:
mysql> INSERT INTO myset (col) VALUES
-> ('a,d'), ('d,a'), ('a,d,a'), ('a,d,d'), ('d,a,d');
Query OK, 5 rows affected (0.01 sec)
Records: 5 Duplicates: 0 Warnings: 0
Beim Abrufen erscheinen alle diese Werte als
'a,d'
:
mysql> SELECT col FROM myset;
+------+
| col |
+------+
| a,d |
| a,d |
| a,d |
| a,d |
| a,d |
+------+
5 rows in set (0.04 sec)
Wenn Sie eine SET
-Spalte auf einen nicht
unterstützten Wert setzen, wird dieser ignoriert, und es wird
eine Warnung ausgegeben:
mysql>INSERT INTO myset (col) VALUES ('a,d,d,s');
Query OK, 1 row affected, 1 warning (0.03 sec) mysql>SHOW WARNINGS;
+---------+------+------------------------------------------+ | Level | Code | Message | +---------+------+------------------------------------------+ | Warning | 1265 | Data truncated for column 'col' at row 1 | +---------+------+------------------------------------------+ 1 row in set (0.04 sec) mysql>SELECT col FROM myset;
+------+ | col | +------+ | a,d | | a,d | | a,d | | a,d | | a,d | | a,d | +------+ 6 rows in set (0.01 sec)
Wenn der strikte SQL-Modus aktiviert ist, führen Versuche,
ungültige SET
-Werte einzufügen, zu einer
Fehlermeldung.
SET
-Werte werden numerisch sortiert.
NULL
-Werte werden dabei vor
Nicht-NULL
-Werten einsortiert.
Meist werden Sie SET
-Werte mithilfe der
Funktion FIND_IN_SET()
oder des Operators
LIKE
durchsuchen:
mysql>SELECT * FROM
mysql>tbl_name
WHERE FIND_IN_SET('value
',set_col
)>0;SELECT * FROM
tbl_name
WHEREset_col
LIKE '%value
%';
Die erste Anweisung findet Datensätze, bei denen
set_col
den Mitgliedswert
value
enthält. Die zweite ist
ähnlich, aber nicht identisch: Sie findet Datensätze, bei
denen set_col
value
an beliebiger Stelle (auch als
Teil-String eines anderen Mitglieds) enthält.
Die folgenden Anweisungen sind ebenfalls zulässig:
mysql>SELECT * FROM
mysql>tbl_name
WHEREset_col
& 1;SELECT * FROM
tbl_name
WHEREset_col
= 'val1
,val2
';
Die erste Anweisung sucht nach Werten, die das erste Mitglied
der Menge enthalten. Die zweite sucht nach einer exakten
Übereinstimmung. Seien Sie bei Vergleichen des zweiten Typs
vorsichtig. Der Vergleich von Mengenwerten mit
'
gibt andere Resultate zurück als der Vergleich mit
val1
,val2
''
.
Sie sollten die Werte in derselben Reihenfolge angeben, in der
sie in der Spaltendefinition aufgelistet sind.
val2
,val1
'
Wenn Sie alle möglichen Werte für eine
SET
-Spalte bestimmen wollen, verwenden Sie
SHOW COLUMNS FROM
und
verarbeiten die tbl_name
LIKE set_col
SET
-Definition in der Spalte
Type
der Ausgabe.
Dies ist eine Übersetzung des MySQL-Referenzhandbuchs, das sich auf dev.mysql.com befindet. Das ursprüngliche Referenzhandbuch ist auf Englisch, und diese Übersetzung ist nicht notwendigerweise so aktuell wie die englische Ausgabe. Das vorliegende deutschsprachige Handbuch behandelt MySQL bis zur Version 5.1.