mysql variable_MySQL:@variable与变量。 有什么不同?

在另一个问题中,我发布了一个人告诉我,两者之间是有区别的:

@variable

和:

variable

在MySQL中。 他还提到了MSSQL如何具有批处理范围,而MySQL如何具有会话范围。 有人可以为我详细说明吗?

#1楼

在MySQL中, 用户定义的变量 。 您可以定义自己的。

SET @a = 'test';

SELECT @a;

在存储程序之外,不带@的variable是系统变量 ,您无法定义自己。

此变量的范围是整个会话。 这意味着,尽管您与数据库的连接存在,但仍可以使用该变量。

这与MSSQL相反,在MSSQL中,变量仅在当前的查询批次(存储过程,脚本或其他)中可用。 在同一会话中,将不能以其他批次使用它。

#2楼

MySQL具有

它们是松散类型的变量,可以在会话的某处初始化,并保持其值直到会话结束。

它们以@符号开头,例如:

您可以使用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 ;这些“会话变量” ”与特定于会话的用户定义变量无关。)

#3楼

原则上,我在存储过程中使用UserDefinedVariables(以@开头)。 这使工作变得更轻松,尤其是当我在两个或多个存储过程中需要这些变量时。 只是当我仅需要一个存储过程中的变量时,我才使用系统变量(不带@)。

@Xybo:我不明白为什么在StoredProcedures中使用@variables应该会有风险。 您能简单解释一下“范围”和“边界”吗(对我来说,这是一个新手)?

#4楼

MSSQL要求过程中的变量为DECLAREd,人们使用@Variable语法(DECLARE @TEXT VARCHAR(25)='text')。 此外,MS允许在过程的任何块中进行声明,这与mySQL不同,mySQL要求在顶部使用所有DECLARE。

虽然在命令行上不错,但我认为在mySQL的存储过程中使用“ set = @variable”是有风险的。 没有范围,变量跨越范围边界。 这类似于在JavaScript中声明的不带“ var”前缀的变量,这些变量将成为全局命名空间并产生意外的冲突和覆盖。

我希望mySQL的优秀人士将允许在存储过程的各个块级别使用DECLARE @Variable。 注意@(在符号处)。 @符号前缀有助于将变量名与表列名分开-因为它们通常是相同的。 当然,总是可以添加“ v”或“ l_”前缀,但是@符号是一种方便且简洁的方法,可以使变量名与您要从中提取数据的列匹配而不会破坏数据。

MySQL是存储过程的新手,他们在第一个版本中做得很好。 很高兴看到他们在这里采用什么形式,并观察该语言在服务器端的各个方面。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值