MySQL/Language/User Variables

局部变量

编辑

局部变量(不以@为前缀)是强类型的,并且被限定在被声明的存储的程序块中。局部变量不能在函数或存储过程之外访问。[1].

举例[2]:

DECLARE MyVariable1 INT DEFAULT 1;

用户Session变量

编辑

Session变量(以@为前缀)是松散键入并限定在会话中。变量名对大小写不敏感。既不需要也不能被声明,只需直接使用它们即可。

执行SET语句使用=或:=来赋值:

SET @var_name = expr [, @var_name = expr] ...

expr可以为整数、实数、字符串或者NULL值。需要以括号括起查询,以便将其作为子查询执行:

SET @countTotal = (SELECT COUNT(*) FROM nGrams);

可以使用SELECT ... INTO:

 SELECT COUNT(*) INTO @countTotal FROM nGrams;

 SET @id = 0, @name = '';
 SELECT id, name INTO @id, @name FROM table1 limit 1;
 SELECT @id, @name;

也可以用语句代替SET来为用户变量分配一个值。在这种情况下,分配符必须为:=而不能用=,因为在非SET语句中=被视为一个比较 操作符。

mysql> SET @t1=0, @t2=0, @t3=0;
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1  | @t2  | @t3  |
+----------------------+------+------+------+
|                    5 |    5 |    1 |    4 |
+----------------------+------+------+------+
  • 没有初始化的变量,其值是NULL。
  • 在SELECT语句中,表达式发送到客户端后才进行计算。这说明在HAVING、GROUP BY或者ORDER BY子句中,不能使用包含SELECT列表中所设的变量的表达式。
  • 一般原则是不要在语句的一个部分为用户变量分配一个值而在同一语句的其它部分使用该变量。可能会得到期望的结果,但不能保证。
 select @test := 2;
 select @test + 1;  -- returns 3

 set @startdate='some_start_date', @enddate='some_end_date'

 SELECT @toremember:=count(*) FROM membros;
	
 select @numzero := count(*) from table1 where field=0; 
 select @numdistinct := count(distinct field) from table1 where field <> 0 ; 
 select @numzero @numdistinct;

系统变量

编辑

设置一个GLOBAL变量的值,使用下面的语法:

mysql> SET GLOBAL sort_buffer_size=value;
mysql> SET @@global.sort_buffer_size=value;

要想设置一个SESSION变量的值,使用下面的语法:

mysql> SET SESSION sort_buffer_size=value;
mysql> SET @@session.sort_buffer_size=value;
mysql> SET sort_buffer_size=value;

LOCAL是SESSION的同义词。

要想检索一个GLOBAL变量的值,使用下面的语法:

mysql> SELECT @@global.sort_buffer_size;
mysql> SHOW GLOBAL VARIABLES like 'sort_buffer_size';

要想检索一个SESSION变量的值,使用下面的语法:

mysql> SELECT @@sort_buffer_size;
mysql> SELECT @@session.sort_buffer_size;
mysql> SHOW SESSION VARIABLES like 'sort_buffer_size';

这里,LOCAL也是SESSION的同义词。

用SELECT @@var_name搜索一个变量时(也就是说,不指定global.、session.或者local.),MySQL返回SESSION值(如果存在),否则返回GLOBAL值。

对于SHOW VARIABLES,如果不指定GLOBAL、SESSION或者LOCAL,MySQL返回SESSION值。

当设置GLOBAL变量需要GLOBAL关键字但检索时不需要它们的原因是防止将来出现问题。如果我们移除一个与某个GLOBAL变量具有相同名字的SESSION变量,具有SUPER权限的客户可能会意外地更改GLOBAL变量而不是它自己的连接的SESSION变量。如果我们添加一个与某个GLOBAL变量具有相同名字的SESSION变量,想更改GLOBAL变量的客户可能会发现只有自己的SESSION变量被更改了。

参考文献

编辑