MySQL supporte les variables utilisateur spécifiques à la
connexion avec la syntaxe @variablename
. Un nom
de variable consiste de caractères alpha-numériques, basés sur
le jeu de caractères courant, de
‘_
’,
‘$
’, et
‘.
’. Le jeu de caractères par
défaut est ISO-8859-1 Latin1. Cette valeur peut être changée en
utilisant l'option --default-character-set
de
mysqld
. See Section 5.8.1, « Le jeu de caractères utilisé pour les données et le stockage ».
Les variables n'ont pas besoin d'être initialisés. Elles sont à
NULL
par défaut et peuvent contenir un entier,
un réel ou une chaîne. Toutes les variables d'un thread sont
automatiquement libérées lorsque le thread se termine.
Vous pouvez déclarer une variable avec la syntaxe de
SET
:
SET @variable= { expression entier | expression réel | expression chaîne } [,@variable= ...].
Vous pouvez aussi assigner une valeur à une variable avec
d'autres commande que SET
. Par contre, dans ce
cas là, l'opérateur d'assignation est :=
au
lieu de =
, parce que =
est
réservé aux comparaisons dans les requêtes autres que
SET
:
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 |
+----------------------+------+------+------+
| 5 | 5 | 1 | 4 |
+----------------------+------+------+------+
Les variables utilisateur peuvent être utilisés là où les
expressions sont allouées. Notez que cela n'inclut pas pour
l'instant les contextes où un nombre est explicitement requis,
comme ce qui est le cas avec la clause LIMIT
dans une requête SELECT
, ou la clause
IGNORE nombre LINES
dans une requête
LOAD DATA
.
Note : dans une requête
SELECT
, chaque expression est n'évaluée que
lors de l'envoi au client. Cela signifie que pour les clauses
HAVING
, GROUP BY
, ou
ORDER BY
, vous ne pouvez vous référer à une
expression qui implique des variables qui sont définies dans la
partie SELECT
. Par exemple, la requête
suivante ne produira pas le résultat
escompté :
mysql> SELECT (@aa:=id) AS a, (@aa+3) AS b FROM nom_de_table HAVING b=5;
La raison est que @aa
ne contiendra pas la
valeur de la ligne courante, mais celle de id
pour la dernière ligne acceptée.
La règle générale est de ne jamais assigner et utiliser la même variable dans la même commande.
Un autre problème avec l'affectation de variable et son
utilisation dans la même commande est que le type de valeur par
défaut est basé sur le type de la variable dans la commande de
départ. Une variable non-assignée est supposée être de type
NULL
ou de type STRING
.
L'exemple suivant illustre bien ce cas de figure :
mysql>SET @a="test";
mysql>SELECT @a,(@a:=20) FROM table_name;
Dans ce cas, MySQL va indiquer au client que la colonne 1 est une
chaîne, et il convertira tous les accès à la variable
@a
en chaîne, même si @a recevra finalement
un nombre dans la seconde ligne. Après l'exécution de la
commande, @a
sera considéré comme un nombre.
Si vous avez des problèmes avec cela, essayer d'éviter d'affecter et d'utiliser la même variable dans la même commande, ou bien initialisez la variable avec les valeurs de 0, 0.0 ou "" avant de l'utiliser.
This is a translation of the MySQL Reference Manual that can be found at dev.mysql.com. The original Reference Manual is in English, and this translation is not necessarily as up to date as the English version.