为啥在 MySQL 中的变量前使用 @? [复制]

Posted

技术标签:

【中文标题】为啥在 MySQL 中的变量前使用 @? [复制]【英文标题】:Why use @ in front of variables in MySQL? [duplicate]为什么在 MySQL 中的变量前使用 @? [复制] 【发布时间】:2012-11-14 13:25:09 【问题描述】:

可能重复:mysql: @variable vs. variable. Whats the difference?

我来自前端背景,如果这个问题看起来很简单,请多多包涵。

我注意到大多数关于 MySQL 存储过程的帖子都使用 @ 作为变量。我知道这意味着该变量是一个会话变量,只要连接处于活动状态,它就会在存储过程中持续存在,但是为什么您希望一个变量在 1 个连接中交叉污染多个存储过程调用?将所有内容本地化不是更好吗?如果我不使用@,那么在下一次存储的proc 调用中,变量会重新初始化为NULL,这不是更可取吗?这样做是出于性能原因吗?

【问题讨论】:

why would you want one variable to cross-contaminate multiple stored proc calls within 1 connection 我没明白。添加变量是如何做到的? @Ibu 我的意思是,如果在一个存储过程中,您执行 SET @foo = "bar",那么在同一连接中的下一个存储过程中,@foo 仍将设置为“bar " 【参考方案1】:

@ 符号表示User-Defined Variable。看来您已经阅读了这方面的手册条目,但我还是会发布此摘录。

您可以在一个语句中将值存储在用户定义的变量中,然后稍后在另一个语句中引用它。这使您能够将值从一个语句传递到另一个语句。用户定义的变量是特定于连接的。也就是说,一个客户端定义的用户变量不能被其他客户端看到或使用。给定客户端连接的所有变量都会在该客户端退出时自动释放。

如果您在单个连接中有多个存储过程调用,您应该非常清楚在整个请求中何时以及是否对变量的值进行了任何重新定义时使用了哪些变量。此外,您应该在某些条件下使用事务,这也有助于确保其中定义的 UDV 在请求的整个生命周期内不会被外部来源损坏。

【讨论】:

谢谢,但这并没有告诉我为什么我应该或不应该在我的变量中使用@,除非文档这么说?如果我不使用@,那么在下一次存储的proc 调用中,变量会重新初始化为NULL,这不是更可取吗?

以上是关于为啥在 MySQL 中的变量前使用 @? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 autoconf 脚本中的条件在变量前加上“x”?

为啥R中的回归会删除因子变量的索引1? [复制]

为啥设置一个变量等于另一个变量会改变这段代码中的任何内容? [复制]

为啥即使使用 setlocal enabledelayedexpansion 也无法访问 for 循环(批处理文件)中的局部变量? [复制]

为啥我可以在复制构造函数中访问私有变量?

mysql的安装为啥没有配置环境变量?