概念
在MySQL数据库的存储过程和函数中,可以使用变量来存储查询或计算的中间结果数据,或者输出最终的结果数据。
变量分为系统变量以及用户自定义变量。
系统变量
- 变量由系统定义,不是由用户定义,属于服务器层面。启动MySQL服务实例期间,MySQL将为MySQL服务器内存中的系统变量赋值,这些系统变量定义了当前MySQL服务实例(就是MySQL服务)的属性、特征。这些系统变量的值要么是编译MySQL时参数的默认值,要么是配置文件(.ini等)中的参数值。
- 每一个MySQL客户机成功连接MySQL服务器后,都会产生与之对应的会话。会话期间,MySQL服务实例会在MySQL服务器内存中生成与该会话对应的会话系统变量,这些会话系统变量的初始值是全局系统变量的复制。
系统变量分为全局系统变量以及会话系统变量。
一、全局系统变量
全局系统变量针对于所有会话(连接)有效,但重启服务后无效了(在连接期间定义的变量无效,配置文件中的仍然有效)。
- 查看全局系统变量
#查看所有全局系统变量
SHOW GLOBAL VARIABLES;
#加LIKE
SHOW GLOBAL VARIABLES LIKE 'admin_%';
- 修改全局系统变量的值(会话系统变量同样)
- 方式1:修改MySQL 配置文件 ,继而修改MySQL系统变量的值(该方法需要重启MySQL服务)
- 方式2:在MySQL服务运行期间,使用“set”命令重新设置系统变量的值
#为某个系统变量赋值
SET @@global.变量名=值;
SET GLOBAL 变量名=值;
会话系统变量
仅针对于当前会话(连接)有效,其它会话不能使用。修改当前会话的变量也不会影响到其它会话,不过在当前会话中可以修改全局系统变量,以达到与其它会话共用变量的目的。
- 查看会话系统变量
#查看所有会话变量
SHOW SESSION VARIABLES;
SHOW VARIABLES;
- 修改会话系统变量的值
#为某个会话变量赋值
SET @@session.变量名=值;
SET SESSION 变量名=值
全局变量的持久化
使用SET GLOBAL语句设置的变量值只会 临时生效 。 数据库重启 后,服务器又会从MySQL配置文件中读取变量的默认值。
设置服务器语句超时的限制,可以通过设置系统变量max_execution_time来实现:
SET GLOBAL MAX_EXECUTION_TIME=2000;
设置服务器的最大连接数为1000:
SET global max_connections = 1000;
MySQL 8.0版本新增了 SET PERSIST 命令
SET PERSIST global max_connections = 1000;
不同于一般的语句,该语句会将配置保存在mysqld-auto.cnf 文件中,下次启动时读取,也就是说,该配置不会因为重启而失效。
二、用户变量
用户变量是用户自己定义的,作为 MySQL 编码规范,MySQL 中的用户变量以 一个“@” 开头。根据作用范围不同,又分为会话用户变量
和局部变量
。
会话用户变量
- 定义
SET @用户变量=值
SET @用户变量:=值
SELECT @用户变量 :=表达式[FROM等子句];
SELECT 表达式 INTO @用户变量 [FROM等子句];
- 查看
SELECT @用户变量;
局部变量
定义:可以使用 DECLARE 语句定义一个局部变量作用域:仅仅在定义它的 BEGIN … END 中有效,且只能放在前面(其它语句前)。
BEGIN
#声明局部变量
DECLARE 变量1 数据类型 [DEFAULT 默认值];
DECLARE 变量2,变量3,... 数据类型 [DEFAULT 默认值];
#为局部变量赋值
SET 变量1 = 值;
SELECT 字段 INTO 变量2 [FROM 子句];
#查看局部变量的值
SELECT 变量1,变量2,变量3;
END
会话用户变量与局部变量对比
变量类型 | 作用域 | 定义位置 | 语法 |
---|---|---|---|
会话用户变量 | 作用域当前会话 | 定义位置会话的任何地方 | 语法加@符号,不用指定类型 |
局部变量 | 定义它的BEGIN END中 | BEGIN END的第一句话 | 一般不用加@,需要指定类型 |