MySQL删除会话变量

时间:2014-07-22 20:45:49

标签: mysql session-variables

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

SET @id = 0;

SELECT * FROM my_table
WHERE id = @id;

问题:在查询完成后删除会话变量是一个好习惯(出于安全原因)?最合适的方法是什么?

研究:我发现了以下建议,但有一些疑问,因为它看起来像" uninitialise",而不是" undeclare":

SET @id = NULL;

3 个答案:

答案 0 :(得分:9)

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

您评论道:

  

使用名称参数比使用"?"放置参数更灵活,因为添加/删除变量不需要在代码中更改订单。

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

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

现在,回答具体问题:

  

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

SET @id = NULL;是唯一的出路。你不能" unclare"会话变量,因为你不能"声明"会话变量(尝试SELECT @dummy_variable_never_declared_before;)。 MySQL会话变量与shell环境变量非常相似。 (2)


(1) ...除非您确定session is closed after you are done。关闭会话肯定会清除所有会话变量。

(2)我了解到bash会话变量can indeed be unset

答案 1 :(得分:1)

我还没有看过手册或其他任何内容。但是我在使用@ -variables时发现它们随着数据库连接而消失。我猜这就是你所说的会话。在任何情况下,重新连接到数据库似乎删除所有变量 如果您将MySQL与Web服务器一起使用,这意味着一旦页面交付,您的所有变量都会被删除。这实际上就是我发现这一点的原因。您不能将SQL @ -variable从一个http调用保留到另一个http。

答案 2 :(得分:0)

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