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


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

@variable

et:

variable

en MySQL. Il a également mentionné comment MSSQL a une portée par lots et MySQL a une portée de session. Est-ce que quelqu'un peut élaborer sur ceci pour moi?


454
2018-06-17 23:04


origine


Réponses:


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

Ce sont des variables faiblement typées qui peuvent être initialisées quelque part dans une session et conserver 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 un SET instruction ou à l'intérieur d'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 précédées d'aucun préfixe.

La différence entre une variable de procédure et une variable définie par l'utilisateur spécifique à la session est que la variable de procédure est réinitialisée à NULL chaque fois que la procédure est appelée, alors que 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 appel de la procédure, @var2 (variable spécifique à la session) ne l'est pas.

(En plus des variables définies par l'utilisateur, MySQL aussi a quelques "variables 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 "variables de session" ne sont pas liées aux variables définies par l'utilisateur propres à la session.)


572
2018-06-17 23:39



En MySQL, @variable indique un variable définie par l'utilisateur. Vous pouvez définir le vôtre.

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

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

La portée de cette variable est la totalité de la session. Cela signifie que pendant que votre connexion avec la base de données existe, la variable peut toujours être utilisée.

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


65
2018-06-17 23:18



MSSQL requiert que les variables dans les procédures soient DECLAREd et que les personnes utilisent la syntaxe @Variable (DECLARE @TEXT VARCHAR (25) = 'text'). De plus, MS autorise les déclarations dans n'importe quel bloc de la procédure, contrairement à mySQL qui requiert tous les DECLARE en haut.

Bien que bon sur la ligne de commande, je pense que l'utilisation de "set = @ varable" dans les procédures stockées dans mySQL est risquée. Il n'y a pas de portée et les variables vivent à travers les limites de la portée. Ceci est similaire aux variables en JavaScript déclarées sans le préfixe "var", qui sont alors l'espace de noms global et créent des collisions inattendues et des écrasements.

J'espère que les bonnes personnes de mySQL autoriseront DECLARE @Variable à différents niveaux de bloc dans une procédure stockée. Notez le @ (au signe). Le préfixe @ sign permet de séparer les noms de variables des noms de colonnes de tables, car ils sont souvent les mêmes. Bien sûr, on peut toujours ajouter un préfixe "v" ou "l_", mais le signe @ est une façon pratique et succincte de faire correspondre le nom de la variable avec la colonne dont vous pourriez extraire les données sans l'écraser.

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


9
2018-03-24 03:38



En principe, j'utilise UserDefinedVariables (préfixé avec @) dans les procédures stockées. Cela facilite la vie, en particulier lorsque j'ai besoin de ces variables dans deux procédures stockées ou plus. Juste quand j'ai besoin d'une variable seulement dans une procédure stockée, que j'utilise une variable système (sans @ préfixé).

@Xybo: Je ne comprends pas pourquoi l'utilisation de @variables dans StoredProcedures devrait être risquée. Pourriez-vous s'il vous plaît expliquer "scope" et "limites" un peu plus facile (pour moi en tant que newbe)?


3
2018-04-27 21:52