MySQL:@variable 与变量有什么不同?

问题描述

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每次调用过程时都会重新初始化 (procedure variable),而@var2(session-specific variable) 则不会。

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

解决方法

在我发布的另一个问题中,有人告诉我,两者之间存在差异:

@variable

和:

variable

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...