MySQL:@变量与变量。 有什么不同? (第2部分)
好的,以 我问的最后一个问题为基础,Mysql 是如何工作的处理以下代码中的 where 语句:
DELIMITER ;//
DROP PROCEDURE IF EXISTS `test`;//
CREATE PROCEDURE `test`
(
id INT
)
BEGIN
SELECT *
FROM some_table
WHERE id = id;
END;//
MySQL 在这种情况下会做什么? 它是否将 where 子句视为
some_table.id = id
或将其视为
some_table.id = some_table.id
现在我正在做类似的事情,
WHERE id = @id
因为我不知道 MySQL 中存在会话变量,并且它没有抱怨,我认为这是一种明确的表达方式“其中该列等于该变量”。
有些人可能会说“呃..当然它把它当作列=变量”,但我可以很容易地说“变量=列”。 那么它是如何处理这个问题的呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
乍一看,MySQL 的变量命名模式有点奇怪。 一般来说,MySQL 区分三种类型的变量:
@@varname
@varname
varname
因此,命名冲突(例如您上面提到的那些)仅出现在存储程序中。 因此,您首先应该尝试通过分配明确的参数名称来避免这些命名冲突,例如在参数前加上
p
(例如pId
)。 如果 MySQL 遇到歧义它会将引用解释为变量的名称 (参见此处):当前的措辞在某种程度上给人一种这种行为可能在未来版本中改变的印象。
MySQL's variable naming schema is a bit weird, when having the first look into it. Generally MySQL differentiates between three types of variables:
@@varname
@varname
varname
So naming conflicts, such as those you mentioned above, only arise within stored programs. Therefore you first should try to avoid these naming conflicts by assigning unambiguous parameter names, e.g. by prefxing the parameters with
p
such aspId
. If MySQL encounters an ambiguity it will interpret the reference as the name of a variable (see here):The wording currently somehow gives the impression that this behaviour could change in future versions.
我非常确定 @ 表示它是过程中的变量,而不是引用表列。 只有一个名为
id
的表列,因此在本例中它是明确的。 如果您正在进行联接,那么您需要为其添加前缀:无论它在哪里,变量总是需要 @ 前缀,如在此查询中所示:
第一个 id 是明确的表列 table1.id, @id 引用存储过程变量。
I'm pretty sure that the @ signifies that it's a variable in the procedure, rather than referencing a table column. There is only one table column named
id
, so in this case it is unambiguous. If you were doing a join, then you would need to prefix it:It doesn't matter where it is, the variable will always require the @ prefix, as in this query:
the first id is the unambiguous table column table1.id, and the @id references the stored procedure variable.