在mysql文档中,mysql变量可分为两大类,即系统变量(会话变量、全局变量)和用户变量(局部变量、用户变量)。
但根据实际应用又被细化为四种类型,即局部变量、用户变量、会话变量、全局变量。
1、局部变量
mysql局部变量,只能用在begin/end语句块中,比如存储过程中的begin/end语句块。
其作用域: 仅限于该语句块。
-- declare语句专门用于定义局部变量,可以使用default来说明默认值
declare age int default 0;
-- 局部变量的赋值方式一
set age=18;
-- 局部变量的赋值方式二
select stu_age into age from student where stu_no='A001';
2、用户变量
mysql中用户变量不用提前申明,在用的时候直接用“@变量名”使用就可以了。
其作用域: 当前连接。
-- 第一种用法,使用set时可以用“=”或“:=”两种赋值符号赋值
set @age=19;
set @age:=20;
-- 第二种用法,使用select时必须用“:=”赋值符号赋值
select @age:=22;
select @age:=stu_age from student where stu_no='A001';
3、会话变量
mysql会话变量,服务器为每个连接的客户端维护一系列会话变量。
其作用域:仅限于当前连接,即每个连接中的会话变量是独立的。
-- 显示所有的会话变量
show session variables;
-- 设置会话变量的值的三种方式
set session auto_increment_increment=1;
set @@session.auto_increment_increment=2;
set auto_increment_increment=3; -- 当省略session关键字时,默认缺省为session,即设置会话变量的值
-- 查询会话变量的值的三种方式
select @@auto_increment_increment;
select @@session.auto_increment_increment;
show session variables like '%auto_increment_increment%'; -- session关键字可省略
-- 关键字session也可用关键字local替代
set @@local.auto_increment_increment=1;
select @@local.auto_increment_increment;
4、全局变量
全局变量影响服务器整体操作,当服务启动时,它将所有全局变量初始化为默认值。要想更改全局变量,必须具有super权限。
其作用域: server的整个生命周期。
-- 显示所有的全局变量
show global variables;
-- 设置全局变量的值的两种方式
set global sql_warnings=ON; -- global不能省略
set @@global.sql_warnings=OFF;
-- 查询全局变量的值的两种方式
select @@global.sql_warnings;
show global variables like '%sql_warnings%';
5、几种变量的对比使用
操作类型 | 全局变量 | 会话变量 | 用户变量 | 局部变量(参数) |
文档常用名 | global variables | session variables | user-defined variables | local variables |
出现的位置 | 命令行、函数、存储过程 | 命令行、函数、存储过程 | 命令行、函数、存储过程 | 函数、存储过程 |
定义的方式 | 只能查看修改,不能定义 | 只能查看修改,不能定义 | 直接使用, |
|
有效生命周期 | 服务器重启时恢复默认值 | 断开连接时,变量消失 | 断开连接时,变量消失 | 出了函数或存储过程的作用域,变量无效 |
查看所有变量 |
|
| - | - |
查看部分变量 |
|
| - | - |
查看指定变量 |
|
|
|
|
设置指定变量 |
|
|
|
|
总结
- 其实还有一个存储过程和函数的参数,这种类型和局部变量基本一致,当成局部变量来使用就行了。
- 在表格中有一个容易疑惑的点就是无论是全局变量还是会话变量都有
select@@变量名
的形式。 -
select@@变量名
这种形式默认取的是会话变量,如果查询的会话变量不存在就会获取全局变量,比如@@max_connections
- 但是
SET
操作的时候,set @@变量名=xxx
总是操作的会话变量,如果会话变量不存在就会报错