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;
我们使用变量时,尽量使用范围小的,这样能尽量减少多次操作直接的影响。