MySQL删除会话变量

Zon*_*Zon 10 mysql session-variables

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

SET @id = 0;

SELECT * FROM my_table
WHERE id = @id;
Run Code Online (Sandbox Code Playgroud)

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

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

SET @id = NULL;
Run Code Online (Sandbox Code Playgroud)

Ran*_*eed 9

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

你评论说:

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

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

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

现在,回答具体问题:

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

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


(1) ......除非你确定会议结束后会议结束.关闭会话肯定会清除所有会话变量.

(2)我了解到bash会话变量确实可以取消设置.

  • 你好.谢谢你的回答.我使用NO GLOBAL VARIABLES或PROCEDURES.我使用会话变量 - 它是不同的.它不是我的发明,而是标准的MySQL方法.我发现没有争论为什么它不应该有代码味道或为什么它是一个坏的做法.虽然问题是如何完成变量,而不是如何传递参数,我想澄清一下这个位置."?" - 方法的不适不在于声明工作,而是在MySQL脚本中移动参数顺序后必须在语言代码中进行更改. (3认同)