文章目录

  • MySQL 变量分类
  • 系统变量
    • 查看系统变量
    • 设置系统变量
      • 如何通过配置文件来设置变量值
      • 通过命令行选项来设置变量值
    • 动态设置全局级的系统变量
    • 设置静态的系统变量
    • 设置会话级的系统变量
    • 引用系统变量
    • 总结
  • 用户自定义变量
    • 用户变量
      • 声明定义用户变量
      • 查看用户变量的值
      • 参考示例
        • 使用命令 set 声明定义会话级的用户变量
        • 使用 select 声明定义会话级的用户变量
        • 使用 select into 语句声明定义用户变量
        • 综合示例
    • 局部变量
      • 声明定义局部变量
      • 局部变量的声明
      • 局部变量的赋值
      • 局部变量的使用(查看、比较、运算等)
      • 参考示例
    • 用户变量和局部变量的区别
  • 状态变量
  • 注意

MySQL 变量分类

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 声明定义会话级的用户变量

使用命令 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 () BEGINDECLARE crs INT DEFAULT 0; # 声明定义局部变量crsWHILE crs < 10 DOINSERT INTO `continent`(`name`) VALUES ('cont'+crs);SET crs = crs + 1; # 局部变量赋值END WHILE;END $$DELIMITER ; -- 声明定界符为分号
CALL insert_ten_rows(); -- 调用存储过程,使用分号结尾

示例二:

/*创建表test1*/
drop table IF EXISTS test1;
create table test1(a int PRIMARY KEY,b int);/*声明脚本的结束符为$$*/
DELIMITER $$
DROP PROCEDURE IF EXISTS proc1;
CREATE PROCEDURE proc1()
BEGIN/*声明了一个局部变量*/DECLARE v_a int;select ifnull(max(a),0)+1 into v_a from test1;select @v_b:=v_a*2;insert into test1(a,b) select v_a,@v_b;
end $$/*声明脚本的结束符为;*/
DELIMITER ;/*调用存储过程*/
call proc1();
/*查看结果*/
select * from test1;

用户变量和局部变量的区别

1.用户变量必须以"@"开头的;局部变量没有这个符号
2.声明局部变量必须指定数据类型,用户变量不需要
3.作用范围不同,用户变量在整个连接会话中的任何地方都可以引用,局部变量只在 begin...end 语句块内有效,离开 begin...end 语句块则失效

状态变量

Server Status Variables(服务器状态变量)

MySQL状态变量(Server Status Variables)是当前服务器从启动后累计的一些系统状态信息,例如最大连接数,累计的中断连接等等,主要用于评估当前系统资源的使用情况以进一步分析系统性能而做出相应的调整决策。这个估计有人会跟常规的系统变量混淆,其实状态变量是动态变化的,另外,状态变量是只读的:只能由MySQL服务器本身设置和修改,对于用户来说是只读的,不可以通过SET语句设置和修改它们,而系统变量则可以随时修改。状态变量也分为会话级与全局级别状态信息。有些状态变量可以用FLUSH STATUS语句重置为零值。

注意

MySQL 5.7 以后系统变量和状态变量需要从数据库 performance_schema 中进行获取,数据库 information_schema 仍然保留了GLOBAL_STATUSGLOBAL_VARIABLES 两个表做兼容,如果希望沿用在数据库 information_schema 中进行查询的习惯,MySQL5.7 提供了参数 show_compatibility_56,参数值设置为 ON 可以兼容 MySQL 5.7 之前的用法,否则就会报错(ERROR 3167 (HY000))

MySQL数据库变量_数据库参数_MySQL变量_系统变量_用户变量相关推荐

  1. 不属于mysql二进制日志相关的参数_MySQL二进制日志相关问题详解

    本文出处: (保留出处并非什么原创作品权利,本人拙作还远远达不到,仅仅是为了链接到原文,因为后续对可能存在的一些错误进行修正或补充,无他) 今天无意中发现了一个云栖社区举行的MySQL"第一 ...

  2. mysql 命令行如何输入参数_MySQL命令行参数完整版

    mysql支持下面的选项:  ---help,-?  显示帮助消息并退出.  --batch,-B  打印结果,使用tab作为列间隔符,每个行占用新的一行.使用该选项,则mysql不使用历史文件.  ...

  3. mysql function 表名作为参数_mysql 常用的分组聚合函数

    mysql 常用的分组聚合函数 1.聚合运算 一般情况下,需要的聚合数据(和,平均值,最大,最小等)并不总是存储在表中,但是可以执行存储数据的计算来获取它. 根据定义,聚合函数对一组值执行计算并返回单 ...

  4. mysql 主从热备份 5.6 参数_MySQL主从热备份

    多种方法实现Master数据的备份,该些数据都是在从服务器上恢复.备份之前记录主服务器上正在使用二进制日志文件的名字和POS 一.在Master不离线的前台下,去作复制的所有操作 回忆基本步骤: 1. ...

  5. linux将mysql中得配置为可读写_MySQL注入 利用系统读、写文件

    能读写文件的前提 不同系统.不同的数据库版本有细微差异,以下实验在Windows10和Mysql 5.7.26下操作: 1.拥有该File的读权限 or 该目录写的权限 2.当前用户的secure_f ...

  6. Mysql在window下的表现_Mysql在windows系统下的配置

    因为项目测试需求,不得不在本地装一个Mysql才能更方便地进行程序调试,整个过程虽然简单,但也遇到了一点麻烦,所以贴出来当是备忘. 这里采用MySQL Community Server  5.7.12 ...

  7. mysql设置固定ip地址访问_mysql设置指定ip访问,用户权限相关操作

    基础语法 GRANT priv_type ON database.table TO user[IDENTIFIED BY [PASSWORD] 'password'] [,user [IDENTIFI ...

  8. mysql 省份名排序_MySQL:如何利用用户变量进行分组排序并取top1数据

    Excel中分组排序只需要对数据进行升序降序,再利用if函数添加排序序号,即可筛选出分组top数据. Oracle也有row_number()函数对数据进行分组排序,而MySQL并没有此类函数,那么如 ...

  9. mysql 变量定义和赋值_MySQL变量解析

    MySQL变量 MySQL变量分类: ①系统变量 全局变量 会话变量 ②自定义变量 用户变量 局部变量 1.系统变量 变量是由系统提供的,属于服务器层面,分全局变量和会话变量. 系统变量使用语法: 查 ...

最新文章

  1. oracle 回收碎片,Oracle10g中表的碎片空间回收
  2. 漫长的数据中心绿化之路到底该如何走www.shzhenai.com
  3. Bug测试报告--食物链教学工具--奋斗吧兄弟
  4. Lucene学习之——停用词
  5. 工作环境总结(1)开发环境搭建
  6. 搜索不包含关键词_亚马逊listing关键词优化
  7. 【HDU - 5015 】233 Matrix (矩阵快速幂)
  8. mysql 格式化日期 DATE_FORMAT,FROM_UNIXTIME,UNIX_TIME等
  9. java代码将excel文件中的内容列表转换成JS文件输出
  10. java jdbc连接_CPT201 ODBC与JDBC比较
  11. 理论力学知识要点(五)
  12. KeyError: ‘Worksheet sheet does not exist.‘
  13. 图像算法---贝塞尔曲线
  14. 电脑怎么安装excel表格
  15. excel进阶:如何快速自动填充空白单元格上一行的内容
  16. android 个推封装,Android个推快速集成
  17. 树莓派4B之声音传感器模块(python3)
  18. 文献阅读笔记:Smart Homes that Monitor Breathing and Heart Rate
  19. 【十进制 转 二进制】【二进制 转 十进制】10进制 VS 2进制【清华大学考研机试题】
  20. 软文营销评论区怎样营造好的氛围?

热门文章

  1. aws使用技巧_AWS:避免那些“神圣的法案”时刻的一些技巧
  2. java batch_Java EE 7 Batch中传递属性/参数的2种方式
  3. joo工作流_不要错过使用jOOλ或jOOQ编写Java 8 SQL单行代码的机会
  4. 用Java中的抽象类扩展抽象类
  5. 反应式服务中的线程本地状态可用性
  6. jedis入门_Jedis入门
  7. 从Java 10中删除的API
  8. X-Mas Musings –在Grails集成测试中不要使用随机服务器端口
  9. 使用“另类” Cloud Foundry Gradle插件无需停机
  10. JGroups:无需额外基础架构的领导人选举