MySQL:@variable与变量.有什么不同?(第2部分)

aar*_*ona 1 mysql variables session-scope

好的,基于我问的最后一个问题,Mysql如何处理以下代码中的where语句:

DELIMITER ;//
DROP PROCEDURE IF EXISTS `test`;//
CREATE PROCEDURE `test`
(
  id INT
)
BEGIN
  SELECT *
    FROM some_table
   WHERE id = id;
END;//
Run Code Online (Sandbox Code Playgroud)

在这种情况下MySQL会做什么?它是否将where子句视为

some_table.id = id
Run Code Online (Sandbox Code Playgroud)

或者它是否像对待它一样

some_table.id = some_table.id 
Run Code Online (Sandbox Code Playgroud)

现在我正在做类似的事情

WHERE id = @id
Run Code Online (Sandbox Code Playgroud)

因为我不知道MySQL中有会话变量而且它没有抱怨,我认为这是一种明确的方式来说"这个列等于这个变量".

有些人可能会说"呃..当然它把它当作列=变量",但我可以很容易地说"变量=列".那怎么处理呢?

Ste*_*rig 11

首先看一下MySQL的变量命名模式有点奇怪.通常,MySQL区分三种类型的变量:

因此,命名冲突(例如上面提到的冲突)仅出现在存储的程序中.因此,您首先应该尝试通过分配明确的参数名称来避免这些命名冲突,例如通过使用p诸如预先伪装参数pId.如果MySQL遇到歧义,它会将引用解释为变量的名称(参见此处):

[...]局部变量名称不应与列名称相同.如果SQL语句(如SELECT ... INTO 语句)包含对列的引用和声明的具有相同名称的局部变量,则MySQL当前会将该引用解释为变量的名称.[...]

目前的措辞在某种程度上给人的印象是,这种行为可能会在未来版本中发生变化.