一、MySQL系统变量
系统变量是由系统提供,属于服务器层面。
系统变量分为:全局变量和会话变量。
全局变量一般要加 GLOBAL 关键字,例如在《MySQL 基础 ————事务与隔离级别总结》中提到的 GLOBAL TRANSACTION,就属于全局变量,它针对所有连接都会生效,但是一旦MySQL服务重启,同样会失效。
会话变量由 SESSION 关键字修饰,一般可以省略,比如 SET TRANSACTION ISOLATION ,这里的事务隔离级别设置就只针对当前会话,即当前连接。
二、查看系统变量
查看所有的全局或会话系统变量:
SHOW GLOBAL|SESSION VARIABLES;
查看满足条件的部分系统变量:
SHOW GLOBAL VARIABLES LIKE '%char%';
查看具体的变量值:
SELECT @@global.character_set_client;
SELECT @@character_set_client;
三、设置系统变量
系统变量可以被用户修改。有两种方式:
方式一:
SET GLOBAL|[SESSION] 系统变量名 = 值;
方式二:
SET @@global|[session].系统变量名 = 值;
比如,设置事务提交方式(查看事务提交方式:SELECT VARIABLES LIKE 'autocommit' ):
-- 全局
SET GLOBAL autocommit = 0;
SET @@global.autocommit = 0;-- 当前会话
SET [SESSION] autocommit = 0;
SET @@[session].autocommit = 0;
四、自定义变量
自定义变量分为:用户变量和局部变量。
4.1 用户变量
用户变量要求必须带有@符号,只针对当前会话有效。可在当前会话中的任何地方使用,相当于针对本次连接的“全局变量”。
赋值操作可以用 = 或 := 两种。
4.1.1 声明并初始化
SET @变量名 = 变量值;
SET @变量名 := 变量值;
SELECT @变量名 := 变量值;
4.1.2 赋值(更新用户变量的值)
上述初始化的三种方法依然适用,同时,也可以使用 SELECT INTO:
SELECT 字段 INTO @变量名 FROM 表;
4.1.3 使用用户变量
SELECT @变量名;
4.2 局部变量
局部变量的作用域仅仅在定义它的 BEGIN... END(存储过程)中有效。而且声明语句一定要在 BEGIN...END 中的第一句话。
-- 声明
DECLARE 变量名 类型 [DEFAULT 默认值];
-- 赋值
SET 变量名 = 值;
SET 变量名 := 值;
SELECT @变量名 := 值;
SELECT 字段 INTO 变量名 FROM 表;
-- 使用局部变量
SELECT 变量名;
4.3 演示
1、用户变量演示:
SET @name = 'Morty';
SELECT @name; -- 输出 Morty [5Bytes]SET @name = 100;
SELECT @name; -- 输出 100SET @count = 1;
SELECT @count; -- 输出 1SELECT COUNT(*) INTO @count FROM emp ;
SELECT @count; -- 输出 11
2、局部变量演示:
创建存储过程:
-- 创建存储过程
DELIMITER $
CREATE PROCEDURE emp_name_pro()
BEGIN
DECLARE emp_name VARCHAR(5) DEFAULT 'Moryt';
SELECT emp_name;
END $
调用存储过程:
CALL emp_name_pro;
五、用户变量与局部变量的比较
作用域 | 定义和使用位置 | 语法 | |
用户变量 | 当前会话 | 会话中的任何地方 | 必须加@,不用指定类型 |
局部变量 | 存储过程的定义中 | BEGIN... END 的第一句 | 一般不用加@,必须限定类型 |