- MySQL 变量分类
- 系统变量
- 查看系统变量
- 设置系统变量
- 如何通过配置文件来设置变量值
- 通过命令行选项来设置变量值
- 动态设置全局级的系统变量
- 设置静态的系统变量
- 设置会话级的系统变量
- 引用系统变量
- 总结
- 用户自定义变量
- 用户变量
- 声明定义用户变量
- 查看用户变量的值
- 参考示例
- 使用命令 set 声明定义会话级的用户变量
- 使用 select 声明定义会话级的用户变量
- 使用 select into 语句声明定义用户变量
- 综合示例
- 局部变量
- 声明定义局部变量
- 局部变量的声明
- 局部变量的赋值
- 局部变量的使用(查看、比较、运算等)
- 参考示例
- 用户变量和局部变量的区别
- 状态变量
- 注意
MySQL 通过变量来定义当前服务器的特性,保存状态信息等。我们可以通过手动更改变量的值来配置MySQL,也可以通过变量获得MySQL的当前状态信息。
MySQL 的变量类型可以从多个维度来划分:
1.从生效范围来划分可以分为全局变量(GLOBAL VARIABLES)和会话变量(SESSION VARIABLES)。 全局变量影响 MySQL 服务的整体运行方式和状态的变量;会话变量是影响具体客户端会话(一个数据库连接产生一个会话)的操作方式及状态的变量。
2.从变量的修改方式来划分,可以分为动态变量和静态变量。
动态变量是指在 MySQL 运行过程中,可以通过命令 set 随时调整变量值的变量;静态变量是指不能通过命令 set 随时调整变量值,必须通过配置文件设置其值的变量。在配置文件中修改变量的值,必须重启服务后才能生效。
3.从变量定义主体划分,可以分为系统变量和用户自定义变量。
3.1 系统变量就是系统已经定义好的变量,系统变量以 @@
开头。在系统变量中可以分为全局变量和会话变量。有些系统变量既是全局变量也是会话变量。特别注意,系统变量都是全局变量,绝对不存在只是会话变量的系统变量。
全局级的系统变量存在动态变量和静态变量两种;会话级的系统变量也存在动态变量和静态变量两种。并不是所有的会话变量都是可以使用命令 set 随时修改其值的。
3.2 用户自定义变量顾名思义就是用户自己定义的变量,但是用户自定义的变量中包含两种变量:用户变量、局部变量。
3.2.1 用户变量是基于会话变量实现的,仅对当前连接会话有效,作用域等同于会话级的系统变量,所以用户变量就是会话级的变量。用户变量以 @
开头。
3.2.2 局部变量是使用 declare
关键字在 begin...end
语句块中声明定义的变量,其作用范围在begin...end
语句块中,离开这个语句块则自动失效。
注意,在各种文档中提到的用户变量实际是指用户自定义的会话级变量。用户变量不存在全局的变量,换句话说用户无法自定义全局性的变量。
MySQL 还有一种比较特殊的变量,这些通常用于监控 MySQL 服务器的运行状态,可以使我们及时了解 MySQL 服务器的运行状况,我们称之为状态变量,状态变量也分为全局级和会话级。状态变量可以使用 show status 语句查看,show status 也支持 like 匹配查询。
服务器维护着两种系统变量,即全局变量和会话变量。每一个客户端成功连接服务器后,都会产生与之对应的会话。会话期间,MySQL 服务实例会在服务器内存中生成与该会话对应的会话变量,这些会话变量的初始值是全局变量值的拷贝。
MySQL 中的系统变量以两个“@”开头:
1.@@global
仅仅用于标记全局变量; 2.@@session
仅仅用于标记会话变量; 3.@@
首先标记会话变量,如果会话变量不存在,则标记全局变量。
无论是在设置系统变量还是查询系统变量值的时候,只要没有指定到底是全局变量还是会话变量,都当做会话变量来处理。
在 shell 中使用命令 mysqladmin 查看所有的全局级的系统变量:
[root@htlwk0001host ~]# mysqladmin -uroot -p variables;
或者连接数据库后,通过命令 show 查看所有的系统变量:
mysql> show variables; # 不指定SESSION、GLOBAL、LOCAL,则优先显示会话级变量的值,如果没有对应的会话级变量,则显示全局级变量的值
可以使用以下命令查看 MySQL 中所有的全局变量信息:
mysql> SHOW GLOBAL VARIABLES;
可以使用以下命令查看与当前会话相关的所有会话变量:
mysql> SHOW SESSION VARIABLES;
查看满足条件的部分系统变量:
mysql> SHOW GLOBAL VARIABLES LIKE '%data_file_path%'; # 查看指定名称的全局性的系统变量
mysql> SHOW SESSION VARIABLES LIKE '%innodb_data%'; # 查看指定名称的会话级别的系统变量
mysql> SHOW VARIABLES LIKE '%data_file_%'; # 不指定关键词,默认优先显示会话级的系统变量,没有则显示全局的系统变量
查看指定的系统变量,可以在变量表中查询:
mysql> SELECT * FROM INFORMATION_SCHEMA.GLOBAL_VARIABLES WHERE VARIABLE_NAME='VARIABLE_NAME'; # 查询全局的系统变量
mysql> SELECT * FROM INFORMATION_SCHEMA.SESSION_VARIABLES WHERE VARIABLE_NAME='VARIABLE_NAME'; # 查询会话级别的系统变量
查看指定的系统变量,也可以这样查询:
mysql> select @@global.sql_mode; # 查看指定的全局级的系统变量
mysql> select @@session.sql_mode; # 查看指定的会话级的系统变量
mysql> select @@sql_mode; # 不指定关键词,默认查询的是会话级别的系统变量,如果不存在会员级的变量,则会查询对应的全局级的变量的值
查看数据库服务器所有的静态变量(即状态变量):
mysql> show status;
设置系统变量
当服务器启动时,会将所有全局变量初始化为默认值。这些默认值可以在选项文件中或在命令行中指定的选项进行更改。
可以通过以下方法设置系统变量:
修改 MySQL 源代码,然后对 MySQL 源代码重新编译(该方法适用于 MySQL 高级用户,这里不做阐述)。 在 MySQL 配置文件(mysql.ini 或 mysql.cnf 或 my.cnf)中修改 MySQL 系统变量的值(需要重启 MySQL 服务才会生效)。 在 MySQL 服务运行期间,使用 SET 命令重新设置系统变量的值。
如何通过配置文件来设置变量值以变量 local_infile 的设置为例,在命令终端使用 vim 打开配置文件进行编辑:
[root@htlwk0001host ~]# vim /etc/my.cnf
在其中的 [mysqld]
下面添加如下内容:
local-infile=ON # 能不能写成 local_infile=ON,我不知道,没有试过
说明: 1.表示开启,其值可以设置为 ON 或 TRUE 或 1 都可以;表示关闭其值可以设置为 OFF 或 FALSE 或 0 都可以 2.通过配置文件设置的参数值必须重启数据库服务才能生效,并且是永久生效
通过命令行选项来设置变量值mysqld --max_connections=200
动态设置全局级的系统变量
更改全局变量,必须具有 SUPER 权限。设置全局变量的值的方法如下:
mysql> SET @@global.innodb_file_per_table=default;
mysql> SET @@global.innodb_file_per_table=ON;
mysql> SET global innodb_file_per_table=ON;
注: 1.给全局性的系统变量赋值,必须写关键词 global,不写默认是给会话级的系统变量赋值,如果不存在对应的会话级变量则会报错 2.表示某种功能特性开启还是关闭的变量,其值设置为 ON 或 TRUE 或 1 都可以表示开启;设置为 OFF 或 FALSE 或 0 都可以表示关闭 3.更改全局变量只影响更改后连接客户端的相应会话变量,而不会影响目前已经连接的客户端的会话变量(即使客户端执行 SET GLOBAL 语句也不影响)。也就是说,对于修改全局变量之前连接的客户端只有在客户端重新连接后,才会影响到客户端。简而言之,全局变量修改后,客户端必须重新连接才会生效 4.使用 SET 设置全局变量成功后,如果 MySQL 服务重启,数据库的配置会重新初始化,一切按照配置文件进行初始化,因此数据库服务重启后全局变量的配置会失效
设置静态的系统变量MySQL 中还有一些特殊的系统变量,如 log_bin、tmpdir、version、datadir,在 MySQL 服务实例运行期间它们的值不能动态修改,也就是不能使用 SET 命令进行重新设置,这种变量称为静态变量。数据库管理员可以使用前面提到的修改源代码或更改配置文件来重新设置静态变量的值。
设置会话级的系统变量服务器还为每个连接的客户端维护一系列会话变量。在连接时使用相应全局变量的当前值对客户端的会话变量进行初始化。设置会话变量不需要特殊权限,但客户端只能更改自己的会话变量,而不能更改其它客户端的会话变量。设置会话变量的值的方法如下:
mysql> SET @@session.pseudo_thread_id=5; # 如果不存在此会话级的系统变量会报错
mysql> SET session pseudo_thread_id=5; # 如果不存在此会话级的系统变量会报错
mysql> SET @@pseudo_thread_id=5; # 默认设置的是会话系统变量,如果pseudo_thread_id是全局变量,不是会话级的变量,这样赋值会报错,当然如果根本不存在此变量,也会报错
mysql> SET pseudo_thread_id = 5; # 默认设置的是会话系统变量,如果pseudo_thread_id是全局变量,不存在对应的会话变量,这样赋值会报错,当然如果根本不存在此变量,也会报错
注: 1.会话变量的配置在当前会话退出后就失效了,会话断开即失效。 2.LOCAL 是 SESSION 的同义词,所以 SESSION 可以替换成 LOCAL 3.不指定 SESSION 或 GLOBAL 或 LOCAL 默认是 SESSION
引用系统变量@@GLOBAL.var_name
@@SESSION.var_name
@@LOCAL.var_name
@@var_name # 没有指定级别限定符,默认优先获取会话级的系统变量的值
总结
不论使用哪种方式查看或者获取系统变量的值,如果没有指定级别限定符,优先显示或获取会话变量的值;同样的,赋值的时候如果没有指定级别限定符,默认是给会话变量赋值,但是如果不存在该会话变量则会报错。
用户自定义变量用户自定义变量分为用户自定义的会话变量(即用户变量)和局部变量。
用户变量用户变量和会话级的系统变量类似,与连接会话有关,是针对当前登录数据库的会话的变量;也就是说,用户在一个客户端定义的变量不能被其它客户端看到或使用。当客户端退出时,该客户端连接的所有的会话变量将自动释放。
用户变量的作用: 可以先在用户变量中保存值然后在后面的命令语句中引用它。这样可以将值从一个语句传递到另一个语句。
用户变量表示形式: 系统变量都是以 @@
开头,用户自定义的会话变量以 @
开头,例如:@var_name
,其中变量名可以由当前字符集的英文、数字、.
、_
和 $
组成。 默认字符集是 cp1252 (Latin1)
。可以用mysqld
的 --default-character-set
选项更改字符集。用户变量名对大小写不敏感。
/*方式1*/
mysql> set @变量名=值;
/*方式2*/
mysql> set @变量名:=值;
/*方式3*/
mysql> select @变量名:=值;
/*方式4*/
mysql> select 字段 into @变量名 from 表;
注:用户变量的赋值和变量的声明一模一样。
查看用户变量的值mysql> select @var_name;
注:show
命令只能查看系统变量的值,不能查看用户变量的值。
使用命令 set
定义会话级的用户变量,定义形式是以 @
开始,如:@var_name
。分配符可以使用 =
或者 :=
。未分配的用户变量有一个默认值 NULL
,类型为字符串。
mysql> SET @t1=0, @t2=1, @t3='hello'; # 声明定义多个用户变量,字符串必须使用单引号或者双引号引起来
Query OK, 0 rows affected (0.00 sec)
mysql> select @t1,@t2,@t3;
+------+------+------+
| @t1 | @t2 | @t3 |
+------+------+------+
| 0 | 1 | hello|
+------+------+------+
1 row in set (0.00 sec)
使用 select 声明定义会话级的用户变量
使用 select 定义用户变量或者赋值,分配符必须为 :=
而不能用 =
,因为在非 set
语句中 =
被视为一个比较操作符。
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1 | @t2 | @t3 |
+----------------------+------+------+------+
| 5 | 5 | 1 | 4 |
+----------------------+------+------+------+
使用 select into 语句声明定义用户变量
mysql> select name into @name from student; # “select name”这个name的返回值必须只有一个才能给变量@name赋值,否则报错
ERROR 1172 (42000): Result consisted of more than one row
mysql> select name into @name from student where id=00000000000000000001;
Query OK, 1 row affected (0.00 sec)
mysql> select @name;
+--------------+
| @name |
+--------------+
| liaowenxiong |
+--------------+
1 row in set (0.00 sec)
综合示例
/*select :=方式创建变量*/
mysql> select @first_name:='路人甲Java',@email:='javacode2018@163.com';
/*使用变量*/
mysql> insert into employees (first_name,email) values (@first_name,@email);
局部变量
局部变量是在 begin...end
语句块中使用关键字 declare
声明定义的变量。
在存储过程和函数中通过 declare
关键字在 BEGIN...END
语句块中声明定义局部变量,在 END
后变量无效。
注意: 1.declare
定义的变量名不能带 @
符号。 2.声明局部变量必须要指定变量的类型。 3.声明在 begin...end
中的第一句话
mysql> declare var_name 类型; # 仅声明了变量
mysql> declare var_name 类型 default 值; # 声明变量且定义了变量的初始值
局部变量的赋值
方法一:
mysql> set var_name = value;
mysql> set var_name := value;
方法二:
mysql> select var_name := value;
mysql> select field_name into var_name from table_name;
局部变量的使用(查看、比较、运算等)
mysql> select var_name;
参考示例
示例一:
DELIMITER $$ -- 声明定界符号为$$
DROP PROCEDURE IF EXISTS insert_ten_rows $$
CREATE PROCEDURE insert_ten_rows ()
BEGIN
DECLARE crs INT DEFAULT 0; # 声明定义局部变量crs
WHILE crs
关注
打赏
最近更新
- 深拷贝和浅拷贝的区别(重点)
- 【Vue】走进Vue框架世界
- 【云服务器】项目部署—搭建网站—vue电商后台管理系统
- 【React介绍】 一文带你深入React
- 【React】React组件实例的三大属性之state,props,refs(你学废了吗)
- 【脚手架VueCLI】从零开始,创建一个VUE项目
- 【React】深入理解React组件生命周期----图文详解(含代码)
- 【React】DOM的Diffing算法是什么?以及DOM中key的作用----经典面试题
- 【React】1_使用React脚手架创建项目步骤--------详解(含项目结构说明)
- 【React】2_如何使用react脚手架写一个简单的页面?