当前位置: 首页 > 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.dtcms.com/a/323651.html

相关文章:

  • 学习嵌入式第二十四天
  • 【Python 语法糖小火锅 · 第 1 涮】
  • Vulnhub----Beelzebub靶场
  • 每周算法思考:栈与队列
  • 使用lightGCN完整训练用户 + 商品向量的 3 步指南
  • 在JVM调优时,你关注哪些指标?
  • 裸露土堆识别准确率↑32%:陌讯多模态融合算法实战解析
  • 20250808组题总结
  • C++11中的移动语义
  • Python训练营打卡Day27-类的定义和方法
  • 【后端】Java Stream API 介绍
  • C++11 ---- 线程库
  • 机器学习(西瓜书)学习——绪论
  • 编译技术的两条演化支线:从前端 UI 框架到底层编译器的智能测试
  • 通过MQTT实现OTA升级方案
  • Linux-Redhat9.5静默安装Oracle19.25单实例教程【参照官方文档,超级详细】
  • 【35】C#实战篇——StopRecordingTimer_Tick事件函数中,解绑函数自己,那么该函数会立即结束吗?还会继续执行该函数中剩余部分吗?
  • windows、linux应急响应入侵排查
  • Oracle数据库重启后打开异常状态的检查步骤
  • 模拟人脑处理文本——从分句到分词,从段落到时间线叙事
  • MySQL时间类型
  • windows上LM-Studio下载安装教程
  • 谷歌搜索 sg_ss 逆向分析
  • 自闭和标签形式(self-closing tags)和标准标签形式
  • [概率 DP]808. 分汤
  • C++入门学习3
  • 开漏和推挽模式的区别
  • QT第一讲- Qt初探
  • XSS攻击演示
  • 常用信号深度解析(SIGINT、SIGPIPE、SIGALRM、SIGTERM等)