当前位置: 首页 > news >正文

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 =;
SELECTINTO 变量名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 ;
http://www.lryc.cn/news/615427.html

相关文章:

  • 机器学习 K-Means聚类 无监督学习
  • 数据结构初阶(7)树 二叉树
  • BGP笔记
  • 机器学习DBSCAN密度聚类
  • 讯飞晓医-讯飞医疗推出的个人AI健康助手
  • 复杂环境下车牌识别准确率↑29%:陌讯动态特征融合算法实战解析
  • 编译技术的两条演化支线:从前端 UI 框架到底层编译器的智能测试
  • Office安装使用?借助Ohook开源工具?【图文详解】微软Office产品
  • 每周算法思考:栈与队列
  • 【数据结构入门】栈和队列
  • 物理AI与人形机器人:从实验室到产业化的关键跨越
  • day15_keep going on
  • [激光原理与应用-202]:光学器件 - 增益晶体 - Nd:YVO₄增益晶体的制造过程与使用过程
  • RecyclerView 缓存机制
  • 202506 电子学会青少年等级考试机器人六级器人理论真题
  • 【自动化运维神器Ansible】playbook自动化部署Nginx案例解析:助力从零构建高效Web服务
  • Kettle ETL 工具存在的问题以及替代方案的探索
  • AWT 事件监听器深入浅出:Action/Mouse/Key/Window 全解析与实战
  • B2.0:对硬件学习的一些个人心得感悟
  • 跨境电商系统开发:ZKmall开源商城的技术选型与代码规范实践
  • Linux 中CentOS Stream 8 - yum -y update 异常报错问题
  • MySQL 主备(Master-Slave)复制 的搭建
  • 每日五个pyecharts可视化图表-line:从入门到精通
  • 基于springboot+vue开发的校园食堂评价系统【源码+sql+可运行】【50809】
  • 计算机系统设计中都有什么任务~计算密集~IO密集~逻辑密集等
  • 通过 Docker 运行 Prometheus 入门
  • 如何在 Excel 中快速求和?【图文详解】Excel求和技巧,Excel求和公式大全,多种方式求和
  • 轻松Linux-5.进程控制
  • drippingblues靶机
  • Easysearch 冷热架构实战