代码之家  ›  专栏  ›  技术社区  ›  Zon

MySQL删除会话变量

  •  16
  • Zon  · 技术社区  · 10 年前

    情况:MySQL查询使用从外部传递的值。这是通过声明和初始化会话变量来完成的,该变量在会话结束之前保持有效:

    SET @id = 0;
    
    SELECT * FROM my_table
    WHERE id = @id;
    

    问题:在查询完成后删除会话变量是一种好的做法吗(出于安全原因)?做这件事最合适的方法是什么?

    研究:我发现了以下建议,但有些怀疑,因为它看起来像“未初始化”,而不是“未声明”:

    SET @id = NULL;
    
    3 回复  |  直到 9 年前
        1
  •  16
  •   Community leo1    7 年前

    使用会话变量传递参数是一种不好的做法(使用全局变量通常表示代码气味)。因此,没有适当或推荐的方法来处理您的情况 (1) .

    您发表了评论:

    使用名称参数比使用“?”放置参数更灵活,因为添加/删除变量不需要更改代码中的顺序。

    这是一种错觉。使用这种方法,您仍然需要在“某处”记录您的过程需要在调用之前声明一些变量。这也介绍了您正试图解决的问题。

    另一方面,存储过程(或准备好的语句)是自记录的,参数具有众所周知的范围和寿命。

    现在,回答具体问题:

    如何删除/取消设置会话变量?

    SET @id = NULL; 是唯一的出路。您不能“取消声明”会话变量,因为您不能“声明”一个会话变量(请尝试 SELECT @dummy_variable_never_declared_before; ). MySQL会话变量与shell环境变量非常相似。 (2)


    (1) …除非你确保 session is closed after you are done 。关闭会话一定会清除所有会话变量。

    (2) 我已经学会了bash会话变量 can indeed be unset .

        2
  •  3
  •   user1904991    9 年前

    我没读过手册什么的。但我发现使用@-变量时,它们会随着数据库连接而消失。我想这就是你所说的会话。无论如何,重新连接到数据库似乎会删除所有变量。
    如果您在web服务器上使用MySQL,这意味着页面一交付,所有变量都会被删除。事实上我就是这样发现的。不能将SQL@-变量从一个http调用保留到另一个http。

        3
  •  2
  •   C.Poh    3 年前

    直接的答案是,在MySQL中使用@variables时,没有删除/取消设置会话变量,关闭会话将清除所有会话变量。检查了MySQL参考手册8.0。正在通读答案,并想让它变得紧凑。干杯!