关于sql:MySQL:@variable与变量。

MySQL: @variable vs. variable. What's the difference?

在另一个问题中,我发了一个帖子,有人告诉我:

ZZU1

还有:

ZZU1

和MySQL。他还提到了MSSQL如何具有批处理范围和MySQL如何具有会话范围。有人能为我详细解释一下吗?


有用户定义变量的概念。

这些变量在届会结束时可能是初始化的,并保持其价值。

他们准备了一个@Sign,like this:@var

您可以用SET初始化此变量。

ZZU1

当你在MySQL中制定一个存储程序时,你可以输入参数并声明本地变量:

1
2
3
4
5
6
7
8
9
10
11
DELIMITER //

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

DELIMITER ;

这些变量没有预先准备。

一个程序变量与一个特定的用户定义变量之间的区别在于,程序变量被重新引入NULL程序的每一次都被称为程序,而会话具体变量不是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
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(会话特异变量)不被命名。

(In addition to user-defined variances,mysql also has some predefined"system variances",which may be"global variances"such as @@global.portor"session variances"such as @@session.sql_mode;these"session variances"are unrelated to session-specific user-defined va


在MySQL中,@variable表示一个用户定义的变量。你可以自己定义。

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

在存储程序之外,一个没有@的系统是一个可变的系统,你无法自定义。

这个变量的范围是整个会话。这意味着当您连接到数据库时,变量仍然可以使用。

This is in contrast with MSQL,where the variable will only be available in the current batch of queries(stored procedure,script,or otherwise).在同一届会议上,在不同的批量中无法找到。


MSSQL requires that varias within procedures be declared and folks use the@variable syntax(declare@text varchar(25)=text').此外,MS allows for declares within any block in the procedure,unlike mysql which requires all the declares at the top.

当指挥线上的好东西,我感觉使用"set=@variable"在Mysql的存储程序中是危险的。在范围界限之外没有任何范围和变量。This is similar to variables in Javascript being declared without the"Var"prefix,which are then the global namespace and create unexpected collistions and overwrites.

我希望Mysql的好民谣能够在一个存储程序中在不同的区块层次上发表可变的声明。Notice the@(at sign).The@sign prefix helps to separate variable names from table column names-as they're often the same.在课程中,一个人可以添加一个"V"或"L"prefix,但@sign是一个手法和简短的方式,可以使变量名称匹配Column,你可以在没有克隆的情况下从中提取数据。

MySQL是新来保存程序的,他们为自己的第一个版本做了一份好工作。这将是一个很好的机会,让我们看看他们把它带到了什么地方,看看语言成熟的服务器侧面。


在原则上,我使用了在存储程序中使用的FinedVarians(predended with@)。这使生活容易,特别是当我需要这些变量在两个或更多的储存程序。当我只需要一个存储程序中的变量,而不是使用一个变量系统(不准备@)。

@XYBO:我不明白为什么在存储程序中使用@variables应该是危险的。你能解释一下"范围"和"边界"吗?