MySQL: переменная @variable. Какая разница?

В другом вопросе, который я отправил, кто-то сказал мне, что есть разница между:

@variable

и

variable

в MySQL. Он также упомянул, как MSSQL имеет пакетную область, а MySQL имеет область сеанса. Может ли кто-нибудь уточнить это для меня?

Ответ 1

MySQL имеет понятие определяемые пользователем переменные.

Они представляют собой свободно типизированные переменные, которые могут быть инициализированы где-то в сеансе и сохранять свое значение до окончания сеанса.

Они добавляются с знаком @, например: @var

Вы можете инициализировать эту переменную оператором SET или внутри запроса:

SET @var = 1

SELECT @var2 := 2

При разработке хранимой процедуры в MySQL вы можете передать входные параметры и объявить локальные переменные:

DELIMITER //

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

DELIMITER ;

Эти переменные не добавляются с префиксами.

Разница между переменной процедуры и определенной пользователем переменной зависит от того, что переменная процедуры повторно инициализируется до NULL каждый раз, когда вызывается процедура, в то время как для переменной, зависящей от сеанса, нет:

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

Как вы можете видеть, var2 (переменная процедуры) повторно инициализируется каждый раз, когда вызывается процедура, а @var2 (переменная, зависящая от сеанса).

(Помимо пользовательских переменных MySQL также имеет некоторые предопределенные "системные переменные", которые могут быть "глобальными переменными", такими как @@global.port или "переменные сеанса", такие как @@session.sql_mode, эти "переменные сеанса", не связаны с определенными пользователем определенными пользователем переменными.)

Ответ 2

В MySQL @variable указывает пользовательскую переменную. Вы можете определить свой собственный.

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

Вне сохраненных программ a variable, без @, является системной переменной, которую вы не можете определить самостоятельно.

Объем этой переменной - это весь сеанс. Это означает, что, хотя ваше соединение с базой данных существует, переменная все еще может быть использована.

Это контрастирует с MSSQL, где переменная будет доступна только в текущей партии запросов (хранимая процедура, script или иначе). Он не будет доступен в другой партии в том же сеансе.

Ответ 3

MSSQL требует, чтобы переменные внутри процедур были DECLAREd, а люди использовали синтаксис @Variable (DECLARE @TEXT VARCHAR (25) = 'text'). Кроме того, MS позволяет объявлять в любом блоке процедуры, в отличие от mySQL, который требует всех DECLARE в верхней части.

Хотя хорошо в командной строке, я чувствую, что использование "set = @variable" внутри хранимых процедур в mySQL рискованно. В пределах границ видимости нет границ и переменных. Это похоже на переменные в JavaScript, объявляемые без префикса "var", которые являются глобальным пространством имен и создают неожиданные столкновения и перезаписывают.

Я надеюсь, что хорошие люди на mySQL позволят DECLARE @Variable на разных уровнях блоков в хранимой процедуре. Обратите внимание на @(при знаке). Префикс @sign помогает отделять имена переменных от имен столбцов таблицы, поскольку они часто одинаковы. Конечно, всегда можно добавить префикс "v" или "l_", но знак @- это удобный и лаконичный способ сопоставить имя переменной с столбцом, из которого вы можете извлечь данные, не сбивая его.

MySQL является новым для хранимых процедур, и они сделали хорошую работу для своей первой версии. Это будет просьба увидеть, где они берут его форму здесь, и наблюдать за аспектами языка на стороне сервера.

Ответ 4

В принципе, я использую UserDefinedVariables (добавленный с @) в хранимых процедурах. Это облегчает жизнь, особенно когда мне нужны эти переменные в двух или более хранимых процедурах. Просто, когда мне нужна переменная только внутри ОДНОЙ хранимой процедуры, я использую Системную переменную (без префикса @).

@Xybo: Я не понимаю, почему использование @variables в StoredProcedures должно быть рискованным. Не могли бы вы объяснить "сферу" и "границы" немного легче (для меня как нового)?