Mysql笔记-系统变量\用户变量管理
1. 变量定义
1.1 定义
在MySQL数据库的存储过程和函数中,可以使用变量来存储查询或计算的中间结果数据,或者输出最终的结果数据。
1.2. 变量分类
根据用途:分为 系统变量(System Variables) 和用户自定义变量(User-Defined Variables)
2.系统变量(System Variables)
2.1.系统变量概念
2.1.1 系统变量作用:
系统变量是 MySQL 服务器内置的配置参数,用于控制服务器的行为(如最大连接数、字符集、日志开关等)。分为全局(GLOBAL)和会话(SESSION)两种作用域
2.1.2 系统变量表示:
以 两个“@” 开头,其中“@@global”仅用于标记全局系统变量,“@@session”仅用于标记会话系统变量。“@@”首先标记会话系统变量,如果会话系统变量不存在,则标记全局系统变量。
2.1.3 系统变量的分类:
根据作用域,可分为全局系统变量和会话系统变量。
- GLOBAL:影响所有客户端连接(新连接生效,已存在的连接需重新设置会话变量)。
- 量针对于所有会话(连接)有效,但不能重启,重启后就又恢复默认值了。
- SESSION(或 LOCAL):仅影响当前会话(默认作用域,断开连接后失效)。
- 仅针对于当前会话(连接)有效。会话期间,当前会话对某个会话系统变量值的修改,不会影响其他会话同一个会话系统变量的值。比如 你用你的mysql client 连上数据库,修改了会话变量,是不会影响其他人的会话的。
- 但是如果在一个会话里面修改的是全局的话,就会有影响。
- 有些变量同时是全局和会话的,就近原则使用。
典型示例:character_set_client
作用:设置客户端发送给服务器的数据的字符集(如 utf8mb4、latin1)。
作用域:全局(默认值) + 会话(可覆盖)。(它既可以通过全局设置默认值(SET GLOBAL),也可以在单个会话中覆盖(SET SESSION))
默认值:由 character_set_server 决定(通常为 utf8mb4)。
什么是会话:每一个MySQL客户机成功连接MySQL服务器后,都会产生与之对应的会话。会话期间,MySQL服务实例会在MySQL服务器内存中生成与该会话对应的会话系统变量,这些会话系统变量的初始值是全局系统变量值的复制。
2.2 系统变量管理
2.2.1 查看所有系统变量-SHOW
#查看所有全局变量
SHOW GLOBAL VARIABLES;
#查看所有会话变量
SHOW SESSION VARIABLES; 或
SHOW VARIABLES;
#查看满足条件的部分系统变量。
SHOW GLOBAL VARIABLES LIKE '%标识符%';
#查看满足条件的部分会话变量
SHOW SESSION VARIABLES LIKE '%标识符%';
举例1. 查看admin相关全局系统变量
SHOW GLOBAL VARIABLES LIKE 'admin_%';
2.2.2 查看指定系统变量-SELECT @@]
#查看指定的系统变量的值
SELECT @@global.变量名;
#查看指定的会话变量的值
SELECT @@session.变量名;
#或者
SELECT @@变量名;
2.2.3 修改系统变量–SET
(1)修改会话/全局变量
SET [SESSION | LOCAL] var_name = value;
SET [GLOBAL | @@global.] var_name = value;
省略作用域时,默认是 SESSION
#为某个系统变量赋值
#方式1:
SET @@global.变量名=变量值;
#方式2:
SET GLOBAL 变量名=变量值;
#为某个会话变量赋值
#方式1:
SET @@session.变量名=变量值;
#方式2:
SET SESSION 变量名=变量值;
-- 设置当前会话的字符集为 utf8mb4
SET SESSION character_set_client = 'utf8mb4';
SET LOCAL wait_timeout = 3600; -- LOCAL 与 SESSION 等价-- 临时调整全局最大连接数(需 SUPER 权限)
SET GLOBAL max_connections = 200;
-- 查看修改后的全局变量
SHOW GLOBAL VARIABLES LIKE 'max_connections';
关于全局变量的修改:
- 需要 SUPER 权限(或 SYSTEM_VARIABLES_ADMIN 权限,MySQL 8.0+)。
- 修改后立即对所有新连接生效,但已存在的会话需重新设置会话变量才会生效。
- 重启 MySQL 服务后,全局变量会被配置文件中的值覆盖(除非变量是动态的且修改后未重启)。
2.2.4 通过配置文件持久化修改 my.cnf|my.ini
若需永久生效,需将变量写入 MySQL 配置文件(如 my.cnf 或 my.ini),位置取决于操作系统:
- Linux:/etc/my.cnf 或 /etc/mysql/my.cnf
- Windows:C:\ProgramData\MySQL\MySQL Server 8.0\my.ini
#bash
[mysqld] -- 全局配置(服务器启动时读取)
max_connections = 200
character_set_server = utf8mb4[session] -- 会话配置(部分变量支持,不常用)
wait_timeout = 3600--重启
# Linux
systemctl restart mysql# Windows(服务管理器或命令行)
net stop MySQL80 && net start MySQL80
2.2.5 动态 vs 静态变量
- 动态变量:可在运行时通过 SET 修改(如 max_connections、wait_timeout),修改后无需重启。
- 静态变量:仅能在配置文件中修改,重启后生效(如 datadir、socket、port)。
通过网址 https://dev.mysql.com/doc/refman/8.0/en/server-systemvariables.html 可查看MySQL文档的系统变量
3. 用户变量(User-Defined Variables)
3.1 用户变量概念
3.1.1 用户变量作用
用户变量是由用户自定义的临时变量,用于存储中间结果或传递数据,仅在当前会话(连接)中有效,断开连接后自动销毁。
3.1.2变量表示:
用户变量分类表达上 以 一个“@” 开头。
3.1.3 用户变量分类
- 会话用户变量:作用域和会话变量一样,只对 当前连接 会话有效。
- 局部变量:只在 BEGIN 和 END 语句块中有效。局部变量只能在 存储过程和函数 中使用。
3.2 会话用户变量管理
3.2.1 会话用户变量定义(声明同时赋值)
用户变量可通过 SET 语句或 SELECT 语句赋值。
#方式1:“=”或“:=” (一般用于赋简单的值)
SET @用户变量 = 值;--常用
SET @用户变量 := 值;
#方式2:“:=” 或 INTO关键字(一般用于赋表中的字段值)
SELECT @用户变量 := 表达式 [FROM 等子句];--常用
SELECT 表达式 INTO @用户变量 [FROM 等子句];
:= 是赋值运算符(仅在 SELECT 中替代 =,避免与比较运算符冲突)
。
INTO 语法需确保查询结果仅一行(否则报错)。
示例:
一、使用set赋值
SET @name = 'Alice'; -- 字符串
SET @age = 25, @salary = 10000.5; -- 同时赋值多个变量
SET @today = CURDATE(); -- 存储函数返回值(当前日期)
二、使用 SELECT 赋值
-- 方式1:INTO 子句
SELECT MAX(salary) INTO @max_salary FROM employees;-- 方式2:直接赋值(推荐)
SELECT @dept_name := department_name
FROM departments
WHERE department_id = 1;
- MySQL 的用户变量无需显式声明类型或创建,变量的存在与否由其是否被赋值决定。当首次对一个用户变量执行赋值操作时,该变量会被自动创建(定义);若未赋值直接使用,变量存在但值为 NULL(但这种情况通常被视为“未正确初始化”)。
3.2.2 会话用户变量使用
可正常查看、比较、运算等
SELECT @用户变量
示例
SELECT AVG(salary) INTO @avgsalary FROM employees;
SELECT @avgsalary;
查看某个未声明的变量时,将得到NULL值
3.3 局部(用户变量)管理
只在 BEGIN 和 END 语句块中有效。局部变量只能在 存储过程和函数 中使用。
3.3.1 局部变量定义(声明):
可以使用 DECLARE 语句定义一个局部变量
DECLARE 变量名 类型 [default 值]; # 如果没有DEFAULT子句,初始值为NULL
- 只能放在 BEGIN ... END 中,而且只能放在第一句
3.3.2 会话用户变量使用
同 3.3.2 模块一致
3.3.3 常用模板
BEGIN
#声明局部变量
DECLARE 变量名1 变量数据类型 [DEFAULT 变量默认值];
DECLARE 变量名2,变量名3,... 变量数据类型 [DEFAULT 变量默认值];
#为局部变量赋值
SET 变量名1 = 值;
SELECT 值 INTO 变量名2 [FROM 子句];
#查看局部变量的值
SELECT 变量1,变量2,变量3;
END
示例:声明局部变量,并分别赋值为employees表中employee_id为102的last_name和salary
DELIMITER //
CREATE PROCEDURE set_value()
BEGIN
DECLARE emp_name VARCHAR(25);
DECLARE sal DOUBLE(10,2);
SELECT last_name,salary INTO emp_name,sal
FROM employees
WHERE employee_id = 102;
SELECT emp_name,sal;
END //
DELIMITER ;