首页 文章

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

提问于
浏览
467

在我发布的另一个问题中,有人告诉我,之间存在以下区别:

@variable

和:

variable

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

4 回答

  • 3

    MySQL 具有user-defined variables的概念 .

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

    它们前面带有 @ 符号,如下所示: @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还有一些预定义的"system variables",可能是"global variables",如 @@global.port 或"session variables",如 @@session.sql_mode ;这些"session variables"与特定于会话的用户定义变量无关 . )

  • 67

    在MySQL中, @variable 表示user-defined variable . 你可以定义自己的 .

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

    在存储的程序之外,没有 @variablesystem variable,您无法自己定义 .

    此变量的范围是整个会话 . 这意味着当您与数据库的连接存在时,仍然可以使用该变量 .

    这与MSSQL形成对比,其中变量仅在当前批次的查询(存储过程,脚本或其他)中可用 . 它不会在同一会话中以不同的批次提供 .

  • 584

    MSSQL要求程序中的变量为DECLAREd,并且人们使用@Variable语法(DECLARE @TEXT VARCHAR(25)='text') . 此外,MS允许在过程中的任何块内声明,不像mySQL需要顶部的所有DECLARE .

    虽然在命令行上很好,但我觉得在mySQL的存储过程中使用“set = @variable”是有风险的 . 跨范围边界没有范围和变量 . 这类似于在没有“var”前缀的情况下声明的JavaScript中的变量,然后是全局命名空间并创建意外的冲突和覆盖 .

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

    MySQL是存储过程的新手,他们为第一个版本做得很好 . 很高兴看到他们在这里采用它的形式,并观察语言的服务器端方面是否成熟 .

  • 10

    原则上,我在存储过程中使用UserDefinedVariables(前缀为@) . 这使生活更轻松,特别是当我在两个或更多存储过程中需要这些变量时 . 就在我只需要一个存储过程中的变量时,我使用系统变量(没有前置@) .

    @Xybo:我不明白为什么在StoredProcedures中使用@variables会有风险 . 你能否更好地解释一下“范围”和“界限”(对我来说是一个新手)?

相关问题