情况:MySQL查询使用从外部传递的值。这是通过声明和初始化会话变量来完成的,该会话变量在会话结束前一直有效:
SET @id = 0;
SELECT * FROM my_table
WHERE id = @id;
问题:在查询完成后删除会话变量是一个好习惯(出于安全原因)?最合适的方法是什么?
研究:我发现了以下建议,但有一些疑问,因为它看起来像" uninitialise",而不是" undeclare":
SET @id = NULL;
答案 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。正在阅读答案并考虑使其紧凑 干杯!