mysql中变量分为局部变量、用户变量、会话变量和全局变量。每种变量的赋值方式,使用方式以及作用范围都不太一样。以下详细介绍这四种类型变量。

一、局部变量

  局部变量一般定义在sql语句块中,如存储过程的的begin/end。作用范围也只在这个语句块中。执行完毕后,就会销毁。局部变量可以使用declare声明,default设置默认值。语法如下:

  DECLARE 变量名称  变量类型 DEFAULT 默认值;



DROP PROCEDURE IF EXISTS proc_test_var_loc;
CREATE PROCEDURE proc_test_var_loc( )
BEGIN 
    DECLARE t1 INT DEFAULT 1; -- local的变量
  SET t1 = t1 +1; 
    SELECT t1 ;
END;

CALL proc_test_var_loc();



  每次调用该存储过程的结果都是一样,因为每次执行完该存储过程,变量都会销毁。当第二次执行的时候就会重新初始化。

二、用户变量

  用户变量的作用返回在当前整个连接,当前连接断开后,变量就会销毁。用户变量不需要声明,直接使用set @变量名即可。语法如下:

  set @变量名 = 变量值 

  set @变量名 :=变量值



DROP PROCEDURE IF EXISTS proc_test_var_user;
CREATE PROCEDURE proc_test_var_user()
BEGIN   
        SET @var1 = @var1 + 1; -- 变量加一
        SET @var2 := @var2 -1; -- 变量减一
    SELECT @num1:=(@var1) AS sum, @num2:=(@var2) AS dif; -- 查询两个变量的和、差
END;
-- 一下两个语句只需要调用一次
SET @var1 = 1; -- 设置初始值
SET @var2 := 2; -- 设置初始值
CALL proc_test_var_user();



  由于用户变量的作用范围在整个连接,所以在一次连接中,执行完SET @var1 = 1;SET @var2 := 2;一次之后,每次调用CALL proc_test_var_user();的结果都不一样。

 三、会话变量

  会话变量又称为session变量,会话变量的作用范围与用户变量一样,在当前连接。当连接断开后,所有的会话变量都被销毁。

  查看会话变量如下:



select @@autocommit; -- 查看一个会话变量
select @@session.autocommit; -- 查看一个会话变量
show session variables like "%bin%"; -- 查看多个会话变量
show session variables; -- 查看所有会话变量



  设置会话变量如下:



set session autocommit = 1;
set @@session.autocommit = 0;
set autocommit = 1; -- 不指定GLOBAL、SESSION或者LOCAL,默认使用SESSION



四、系统变量



服务器启动时,将所有全局变量初始化。这些默认值可以在配置文件或在命令行中进行修改的。要想更改全局变量,必须具有超级权限。全局变量作用于服务器的整个生命周期,服务器重新启动后,设置的变量就会失效。要想让全局变量重启后继续生效,需要更改相应的配置文件。引用全局变量时,必须以“@@”开头。局部变量的名称不能与全局变量的名称相同、否则会在应用中出错。



  查看系统变量如下:



select @@global.autocommit; -- 查看某个系统变量
show global variables like "%bin%"; --查看多个系统变量
show global variables;  --查看所有系统变量



  设置系统变量如下:



set global autocommit = 1; -- 注意:此处的global不能省略。根据手册,set命令设置变量时若不指定GLOBAL、SESSION或者LOCAL,默认使用SESSION
set @@global.autocommit = 0;



  我们使用变量时,尽量使用范围小的,这样能尽量减少多次操作直接的影响。