【问题标题】:MySQL Delete Session VariableMySQL 删除会话变量
【发布时间】:2014-09-13 20:54:38
【问题描述】:

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

SET @id = 0;

SELECT * FROM my_table
WHERE id = @id;

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

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

SET @id = NULL;

【问题讨论】:

  • 如果您的应用程序使用连接池,使用会话可能很危险。声明的全局变量可以保留在原处。将值作为参数简单地传递给任何需要它的查询/过程不是更好吗?
  • 是的,使用了连接池。我认为@id 是一个会话参数,而不是全局参数。使用名称参数比使用“?”放置参数更灵活,因为添加/删除变量不需要代码中的顺序更改。
  • 导致传递给方法键值对并将所有@键替换为相应的值。这是个好主意,谢谢。这有助于我在不同的文件中保持不同的语言不混合。

标签: mysql session-variables


【解决方案1】:

使用会话变量传递参数是一种不好的做法(使用全局变量通常表明代码有异味)。因此,没有适当或推荐的方法来处理您的情况(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

【讨论】:

  • 你好。感谢您的回答。我不使用任何全局变量或程序。我使用会话变量 - 它是不同的。这不是我的发明,而是一种标准的 MySQL 方法。我没有发现为什么它不应该有代码味道或者为什么这是一种不好的做法的争论。虽然问题是如何完成变量,而不是如何传递参数,但我想澄清一下位置。 “?”——方法的不适不在于声明工作,而在于您必须在 MySQL 脚本中更改参数顺序后对语言代码进行更改。
  • @Zon 你可能想发布一些代码来展示你如何使用会话变量。我可能误解了你的用例。但是,您想在会话结束之前销毁会话变量这一事实表明您可能需要使用另一种机制。
  • 添加示例 - 没什么特别的,请参见第一个代码块。我不想破坏,我只是问我应该,为什么以及是否有另一种方式来应对它(变量)。
  • 我需要看看你调用这个 sn-p 的方式。据我所知,这里根本不需要变量。至于“取消设置”变量的方法,将其设置为null 是唯一的方法(请参阅我的答案的第二部分)。
  • 通过会话变量传递值是我的问题中的一个强制性条件。通过否认任务的条件来解决任务并不是一个好习惯。 :)
【解决方案2】:

我没有阅读手册或任何东西。但是我在使用@-variables 时发现它们会随着数据库连接而消失。我想这就是你所说的会话。无论如何,重新连接到数据库似乎会删除所有变量。
如果您将 MySQL 与 Web 服务器一起使用,这意味着您的所有变量都会在页面交付后立即被删除。这实际上就是我发现这一点的方式。您不能将 SQL @ 变量从一个 http 调用保留到另一个。

【讨论】:

  • 除非使用连接池,因为连接不会被破坏;简单地释放以供重用...直到线程超时并被回收,此时全局变量将被重置。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 2012-05-14
    • 1970-01-01
    • 2015-07-09
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-27
    相关资源
    最近更新 更多