MySQL: @ zmienna vs. zmienna. Co za różnica?

W innym pytaniu napisalem ktos mi powiedzial ze jest roznica miedzy:

@variable

I:

variable

W MySQL. Wspomniał również, jak MSSQL ma zakres wsadowy, a MySQL ma zakres sesji. Czy ktoś może mi to wyjaśnić?

Author: Cœur, 2009-06-17

4 answers

MySQL ma pojęcie zmienne zdefiniowane przez użytkownika.

Są to luźno wpisane zmienne, które mogą zostać zainicjowane gdzieś w sesji i zachować ich wartość aż do jej zakończenia.

Są poprzedzone znakiem @, Jak to: @var

Możesz zainicjalizować tę zmienną za pomocą instrukcji SET lub wewnątrz zapytania:

SET @var = 1

SELECT @var2 := 2

Podczas tworzenia procedury składowanej w MySQL, można przekazać parametry wejściowe i zadeklarować lokalne zmienne:

DELIMITER //

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

DELIMITER ;

Zmienne te nie są poprzedzone żadnymi prefiksami.

Różnica między zmienną procedury a zmienną specyficzną dla sesji użytkownika polega na tym, że zmienna procedury jest ponownie inicjalizowana do NULL za każdym razem, gdy procedura jest wywoływana, podczas gdy zmienna specyficzna dla sesji nie jest:

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

Jak widać, var2 (zmienna procedury) jest ponownie uruchamiana za każdym razem, gdy procedura jest wywoływana, podczas gdy @var2 (zmienna specyficzna dla sesji) nie jest.

(W oprócz zmiennych zdefiniowanych przez użytkownika, MySQL również ma pewne predefiniowane "zmienne systemowe", które mogą być" zmiennymi globalnymi", takimi jak @@global.port lub" zmiennymi sesji", takimi jak @@session.sql_mode; te" zmienne sesji " nie są powiązane ze zmiennymi zdefiniowanymi przez użytkownika.)

 641
Author: Quassnoi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-07-22 10:06:51

W MySQL, @variable wskazuje zmienną zdefiniowaną przez użytkownika . Możesz zdefiniować swoje własne.

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

Poza przechowywanymi programami, variable, Bez @, jestzmienną systemową , której nie można samemu zdefiniować.

Zakres tej zmiennej to cała sesja. Oznacza to, że podczas gdy istnieje połączenie z bazą danych, zmienna może być nadal używana.

Jest to w przeciwieństwie do MSSQL, gdzie zmienna będzie dostępna tylko w bieżącej partii zapytania (procedura składowana, skrypt lub inne). Nie będzie on dostępny w innej partii w tej samej sesji.

 73
Author: molf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-25 20:53:05

MSSQL wymaga zadeklarowania zmiennych w procedurach i użycia składni @ zmienna (DECLARE @TEXT VARCHAR(25) = 'text'). Ponadto MS pozwala na deklarowanie w dowolnym bloku procedury, w przeciwieństwie do mySQL, który wymaga wszystkich deklaracji na górze.

Chociaż dobrze działa w linii poleceń, uważam, że używanie "set = @ variable" w procedurach składowanych w mySQL jest ryzykowne. Nie ma zakresu, A zmienne działają poza granicami zakresu. Jest to podobne do zmiennych w JavaScript będących deklarowane bez przedrostka "var", które są wtedy globalną przestrzenią nazw i powodują nieoczekiwane kolizje i nadpisania.

Mam nadzieję, że dobrzy ludzie w mySQL pozwolą DECLARE @Variable na różnych poziomach bloków w ramach procedury składowanej. Zwróć uwagę na znak @ (at). Prefiks znaku @ pomaga oddzielić nazwy zmiennych od nazw kolumn tabeli - ponieważ często są one takie same. Oczywiście zawsze można dodać przedrostek " v " lub "l_" , ale znak @ jest poręcznym i zwięzłym sposobem na nazwa zmiennej pasuje do kolumny, z której możesz wydobywać dane bez ich zatrzaskiwania.

MySQL jest nowy w procedurach składowanych i wykonali dobrą robotę dla swojej pierwszej wersji. Będzie to pretekst, aby zobaczyć, gdzie przyjmują tę formę tutaj i obserwować, jak dojrzewają aspekty języka po stronie serwera.

 10
Author: Xybo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-03-24 03:38:51

Zasadniczo używam UserDefinedVariables (poprzedzonych @) w procedurach składowanych. Ułatwia to życie, zwłaszcza gdy potrzebuję tych zmiennych w dwóch lub więcej procedurach składowanych. Tylko wtedy, gdy potrzebuję zmiennej tylko w ramach jednej procedury składowanej, to używam zmiennej systemowej (bez poprzedzonego@).

@Xybo: Nie rozumiem, dlaczego używanie zmiennych @w StoredProcedures powinno być ryzykowne. Czy mógłbyś wyjaśnić "zakres" i "granice" trochę łatwiej (dla mnie jako newbe)?

 3
Author: Peter,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-27 21:52:59