MySQL:@variables与variables。 有什么不同?

在另一个问题,我贴了一个人告诉我,有一个区别:

@variable 

和:

 variable 

在MySQL中。 他还提到了MSSQL是如何批量范围的,MySQL有会话范围。 有人能为我详细说明吗?

MySQL具有用户定义variables的概念。

它们是松散types的variables,可以在会话中某处进行初始化,并在会话结束之前保持其值。

它们前面加了@符号,如下所示: @var

您可以使用SET语句或在查询中初始化此variables:

 SET @var = 1 SELECT @var2 := 2 

MySQL开发存储过程时,可以传递input参数并声明局部variables:

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

这些variables不包含任何前缀。

过程variables和特定于会话的用户定义variables之间的区别在于,每次调用过程时过程variables都会重新初始化为NULL ,而会话特定的variables则不会:

 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 (过程variables)在每次调用过程时重新初始化,而@var2 (特定于会话的variables)不是。

(除了用户定义的variables外,MySQL 还有一些预定义的“系统variables”,可以是“全局variables”,如@@global.port或“会话variables”,如@@session.sql_mode ;这些“会话variables“与会话特定的用户定义的variables无关。)

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

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

在stored procedures之外,一个没有@variable是一个系统variables ,你不能自己定义。

这个variables的范围是整个会话。 这意味着,虽然你的数据库连接存在,variables仍然可以使用。

这与MSSQL相反,只有当前批次的查询(存储过程,脚本或其他)才能使用该variables。 它不会在同一个会话中以不同的批次提供。

MSSQL要求程序中的variables是DECLAREd,而人们使用@Variable语法(DECLARE @TEXT VARCHAR(25)='text')。 此外,MS允许在过程中的任何块中声明,不像mySQL,它需要顶部的所有DECLARE。

虽然在命令行上,我觉得在存储过程中使用“set = @variable”是有风险的。 范围边界没有范围和variables。 这与JavaScript中的variables类似,没有使用“var”前缀,这是全局命名空间,并创build意外的冲突和覆盖。

我希望mySQL中的好人可以在存储过程中的各个块级别上使用DECLARE @Variable。 注意@(在符号上)。 @符号前缀有助于将variables名与表列名分开 – 因为它们通常是相同的。 当然,我们总是可以添加一个“v”或“l_”前缀,但@符号是一个方便而简洁的方式,让variables名称与您可能从中提取数据的列匹配,而不会将其打开。

MySQL是存储过程的新手,他们为第一个版本做了很好的工作。 看看它们在这里形成的位置,并观察服务器端语言的成熟,这将是一件令人高兴的事情。

原则上,我使用存储过程中的UserDefinedVariables(前缀@)。 这使生活更容易,特别是当我需要两个或更多的存储过程中的这些variables。 就在我只需要一个存储过程中需要一个variables时,比我使用一个系统variables(没有预先@)。

@Xybo:我不明白为什么在StoredProcedures中使用@variables应该是有风险的。 你能解释一下“范围”和“界限”是否容易一些(对于我来说是一个新手)?