MySQL: @variable vs. variable. Quelle est la différence?

dans une autre question que j'ai posté quelqu'un m'a dit qu'il y a une différence entre:

@variable

et:

variable

in MySQL. Il a également mentionné la façon dont MSSQL a la portée de lot et MySQL a la portée de session. Quelqu'un peut-il fournir des précisions sur ce pour moi?

460
demandé sur Cœur 2009-06-18 03:04:00

4 réponses

MySQL a le concept de variables définies par l'utilisateur .

ce sont des variables librement dactylographiées qui peuvent être initialisées quelque part dans une session et garder leur valeur jusqu'à la fin de la session.

ils sont précédés D'un signe @ , comme ceci: @var

vous pouvez initialiser cette variable avec une déclaration SET ou à l'intérieur dans une requête:

SET @var = 1

SELECT @var2 := 2

lorsque vous développez une procédure stockée dans MySQL , vous pouvez passer les paramètres d'entrée et déclarer les variables locales:

DELIMITER //

CREATE PROCEDURE prc_test (var INT)
BEGIN
    DECLARE  var2 INT;
    SET var2 = 1;
    SELECT  var2;
END;
//

DELIMITER ;

Ces variables ne sont pas précédées de préfixes.

la différence entre une variable de procédure et une variable spécifique à une session définie par l'utilisateur est que la variable de procédure est réinitialisée à NULL chaque fois que la procédure est appelée, tandis que la la variable spécifique à la session n'est pas:

CREATE PROCEDURE prc_test ()
BEGIN
    DECLARE var2 INT DEFAULT 1;
    SET var2 = var2 + 1;
    SET @var2 = @var2 + 1;
    SELECT  var2, @var2;
END;

SET @var2 = 1;

CALL prc_test();

var2  @var2
---   ---
2     2


CALL prc_test();

var2  @var2
---   ---
2     3


CALL prc_test();

var2  @var2
---   ---
2     4

comme vous pouvez le voir, var2 (variable de procédure) est réinitialisé chaque fois que la procédure est appelée, alors que @var2 (variable spécifique à la session) ne l'est pas.

(en plus des variables définies par l'utilisateur, MySQL aussi a certaines" variables de système "prédéfinies, qui peuvent être des" variables globales "telles que @@global.port ou" variables de session "telles que @@session.sql_mode ; ces les "variables de session" ne sont pas liées aux variables définies par l'utilisateur.)

578
répondu Quassnoi 2017-08-10 07:29:59

dans MySQL, @variable indique une variable définie par l'utilisateur . Vous pouvez définir la vôtre.

SET @a = 'test';
SELECT @a;

en dehors des programmes stockés, une variable , sans @ , est une variable système , que vous ne pouvez pas définir vous-même.

la portée de cette variable est la session entière. Cela signifie que tant que votre connexion avec la base de données existe, la variable peut encore être utilisée.

ceci est en contraste avec MSSQL, où la variable ne sera disponible que dans le lot courant de requêtes (procédure stockée, script, ou autre). Il ne sera pas disponible dans un autre lot dans la même session.

67
répondu molf 2015-05-25 20:53:05

MSSQL exige que les variables dans les procédures soient déclarées et les gens utilisent la syntaxe @Variable (DECLARE @TEXT VARCHAR(25) = 'text'). En outre, MS permet de déclarer dans n'importe quel bloc de la procédure, contrairement à mySQL qui exige toutes les déclarations au sommet.

bien que bon sur la ligne de commande, je pense que l'utilisation du "set = @variable" dans les procédures stockées dans mySQL est risquée. Il n'y a pas de portée et les variables vivent au-delà des limites de la portée. C'est similaire aux variables en JavaScript étant déclaré sans le préfixe "var", qui sont alors l'espace de noms global et de créer des collisions et des overwrites inattendues.

j'espère que les braves gens de mySQL autoriseront DECLARE @Variable à différents niveaux de block au sein d'une procédure stockée. Notez la @ (au signe). Le préfixe @ sign aide à séparer les noms de variables des noms de colonnes de tableaux - car ils sont souvent les mêmes. Bien sûr, on peut toujours ajouter un "v" ou "l_" préfixe, mais le signe @ est une pratique et de façon succincte pour que le nom de la variable corresponde à la colonne à partir de laquelle vous pourriez extraire les données sans l'abîmer.

MySQL est nouveau pour les procédures stockées et ils ont fait un bon travail pour leur première version. Ce sera un pleaure pour voir où ils prennent forme ici et de regarder du côté serveur aspects de la langue mature.

10
répondu Xybo 2011-03-24 03:38:51

en principe, j'utilise des variables (prédéfinies avec @) dans les procédures stockées. Cela rend la vie plus facile, surtout quand j'ai besoin de ces variables dans deux ou plusieurs procédures stockées. Juste quand j'ai besoin d'une variable seulement à l'intérieur d'UNE Procédure Stockée, que j'utilise une Variable Système (sans avant @).

@Xybo: Je ne comprends pas pourquoi l'utilisation de @variables dans les procédures de stockage devrait être risquée. Pourriez-vous expliquer la "portée" et "frontières" un peu plus facile (pour moi comme un newbe)?

3
répondu Peter 2014-04-27 21:52:59