Sie können einen Wert in einer Benutzervariablen speichern und diese dann später referenzieren. Auf diese Weise können Sie Werte von einer Anweisung an eine andere übergeben. Benutzerdefinierte Variablen sind verbindungsspezifisch, d. h., eine Benutzervariable, die von einem Client definiert wurde, wird von anderen Clients nicht gesehen und kann von diesen auch nicht verwendet werden. Alle Variablen einer gegebenen Clientverbindung werden automatisch freigegeben, wenn diese Verbindung beendet wird.
Benutzervariablen werden als
@
notiert,
wobei der Variablenname var_name
var_name
aus
alphanumerischen Zeichen des aktuellen Zeichensatzes sowie
‘.
’,
‘_
’ und
‘$
’ bestehen kann. Der
Standardzeichensatz ist latin1
(cp1252 West
European). Er lässt sich mit der Option
--default-character-set
für
mysqld ändern. Siehe auch
Abschnitt 5.11.1, „Der für Daten und zum Sortieren benutzte Zeichensatz“. Der Name einer Benutzervariablen
darf auch andere Zeichen enthalten, wenn Sie ihn als String oder
Bezeichner in Anführungszeichen setzen (z. B.
@'my-var'
, @"my-var"
oder
@`my-var`
).
Hinweis: Bei MySQL vor Version 5.0 wird die Groß-/Kleinschreibung unterschieden, ab MySQL 5.0 hingegen nicht mehr.
Eine Möglichkeit zur Einstellung einer benutzerdefinierten
Variablen besteht im Absetzen einer
SET
-Anweisung:
SET @var_name
=expr
[, @var_name
=expr
] ...
Bei SET
kann entweder =
oder
:=
als Zuweisungsoperator verwendet werden. Der
Wert expr
einer Variablen kann als
Integer, reale Zahl, String oder NULL
-Wert
ausgewertet werden.
Sie können einer Benutzervariablen auch mit einer anderen
Anweisung als SET
einen Wert zuweisen. In
diesem Fall muss der Zuweisungsoperator :=
sein; =
darf nicht verwendet werden, da es in
anderen Anweisungen als SET
als
Vergleichsoperator benutzt wird:
mysql>SET @t1=0, @t2=0, @t3=0;
mysql>SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+----------------------+------+------+------+ | @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 | +----------------------+------+------+------+ | 5 | 5 | 1 | 4 | +----------------------+------+------+------+
Benutzervariablen können in Kontexten eingesetzt werden, in denen
Ausdrücke zulässig sind. Hierzu gehören zurzeit keine Kontexte,
die explizit einen literalen Wert erfordern, also beispielsweise
die LIMIT
-Klausel einer
SELECT
-Anweisung oder die IGNORE
-Klausel einer
N
LINESLOAD DATA
-Anweisung.
Wenn einer Benutzervariablen ein String-Wert zugewiesen wird, hat sie denselben Zeichensatz und dieselbe Sortierung wie dieser String. Die Erzwingbarkeit ist Benutzervariablen implizit. (Es handelt sich um dieselbe Erzwingbarkeit wie bei Werten einer Tabellenspalte.)
Hinweis: In einer
SELECT
-Anweisung wird jeder Ausdruck erst dann
ausgewertet, wenn er an den Client gesendet wird. Das bedeutet,
dass in einer HAVING
-, GROUP
BY
- oder ORDER BY
-Klausel keine
Referenzierung eines Ausdrucks möglich ist, der Variablen
beinhaltet, die in der SELECT
-Liste eingestellt
werden. Die folgende Anweisung beispielsweise funktioniert
nicht wie erwartet:
mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM tbl_name
HAVING b=5;
Die Referenzierung von b
in der
HAVING
-Klausel verweist auf ein Alias eines
Ausdrucks in der SELECT
-Liste, die
@aa
verwendet. Das funktioniert nicht so, wie
man es eigentlich erwarten würde: @aa
enthält
den Wert von id
aus dem zuvor ausgewählten
(und nicht dem aktuellen) Datensatz.
Allgemein gesagt darf man niemals einer Benutzervariablen in einem Teil einer Anweisung einen Wert zuweisen und dieselbe Variable in einem anderen Teil derselben Anweisung verwenden. Vielleicht erhalten Sie die erwarteten Ergebnisse, aber dies ist nicht sicher.
Ein weiteres Problem in Zusammenhang mit der Einstellung einer Variablen und ihrer Verwendung in derselben Anweisung besteht darin, dass der standardmäßige Ergebnistyp einer Variablen zu Beginn der Anweisung auf dem Variablentyp basiert. Das folgende Beispiel veranschaulicht dies:
mysql>SET @a='test';
mysql>SELECT @a,(@a:=20) FROM
tbl_name
;
Bei dieser SELECT
-Anweisung meldet MySQL dem
Client, dass Spalte eins ein String ist, und konvertiert alle
Zugriffe auf @a
in Strings, obwohl
@a
für den zweiten Datensatz eine Zahlenmenge
ist. Nachdem die SELECT
-Anweisung ausgeführt
wurde, wird @a
für die nächste Anweisung als
Zahl betrachtet.
Um Probleme in Zusammenhang mit diesem Verhalten zu vermeiden,
sollten Sie entweder dieselbe Variable nicht gleichzeitig in ein
und derselben Anweisung einstellen und verwenden oder aber die
Variable auf 0
, 0.0
oder
''
setzen, um vor ihrer Verwendung den Typ zu
definieren.
Wenn Sie eine Variable referenzieren, die noch nicht initialisiert
wurde, dann hat diese den Wert NULL
, und der
Variablentyp ist ein String.
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.