MySQL数据库变量_数据库参数_MySQL变量_系统变量_用户变量

文章目录

  • 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))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/333105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Mybatis框架快速入门

一、场景模拟 基于自定义Mybatis框架和已有的Mysql数据库Mybatis&#xff0c;查询所有用户信息。 二、创建工程并引入Mybatis框架的坐标 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"…

oidc_使用Java EE和OIDC构建Java REST API

oidc“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 Java EE允许您使用JAX-RS和JPA快速轻松地构建Java REST API。 Java EE是保护伞标…

Mybatis实现CRUD操作

项目实现的功能 查询所有用户信息 通过Id查询用户信息 添加用户&#xff08;回显主键&#xff09; 修改用户信息 删除用户信息 通过用户名字模糊查询 一、引入依赖和工程结构 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http…

Linux系统下MySQL的导出数据语句SELECT … INTO OUTFILE的用法

文章目录关于参数 secure_file_priv按默认参数设定导出表数据到文本文件中自定义分隔符&#xff0c;将表数据导出到 txt 文件中自定义分隔符&#xff0c;将表数据导出到 csv 文件中导出数据时&#xff0c;提示“拒绝访问”总结确保 Linux 用户 mysql 对导出的目标目录拥有写入和…

java cxf_拥抱模块化Java平台:Java 10上的Apache CXF

java cxfJava 9版本终于将Project Jigsaw交付给大众已经过去了一年的时间。 这是一段漫长的旅程&#xff0c;但是在那里&#xff0c;所以发生了什么变化&#xff1f; 这是一个很好的问题&#xff0c;答案并不明显和直接。 总的来说&#xff0c; 拼图项目是一种颠覆性的变化&am…

MySQL数据字典

数据字典就类似于系统编目或花名册&#xff0c;它保存数据库服务器上的元数据信息&#xff08;数据库的整体属性信息&#xff09;。 元数据信息包括&#xff1a;数据库的属性信息、数据表的属性信息、字段的属性信息、视图的属性信息、用户信息、统计类信息等。 MySQL 保存元…

Mybatis映射文件SQL语句模糊查询,#和$的区别和注意事项

Mybatis映射文件SQL语句模糊查询 1. “%”#{value}"%" 在参数中不需要添加 %_ 推荐使用 2. ‘%${value}%’ 在参数中不需要添加 %_ 3. #{abc} 在参数中添加 %_ #和$的区别和注意事项 ${}直接拼接 &#xff0c;不会转换类型 如果是简单类型&#xff0c;必须写${…

启动php-fpm服务器_无服务器冷启动不是问题-这就是为什么(对于大多数应用程序)...

启动php-fpm服务器从无服务器开始时&#xff0c;您很快就会学习/听到有关函数冷启动的信息&#xff08;我相信无服务器云功能 API &#xff09;。 首次调用云功能时或长时间不调用后会发生冷启动。 基本上&#xff0c;服务器&#xff08;是的&#xff0c;有服务器&#xff01;&…

声明定义存储过程或者函数时,其中的 delimiter 关键字是干嘛的呢?

我们写 SQL 的时候&#xff0c;MySQL 怎么判断 SQL 是否已经结束了&#xff0c;可以去执行了&#xff1f; 需要一个结束符&#xff0c;当 MySQL 看到这个结束符的时候&#xff0c;表示可以执行前面的语句了&#xff0c;MySQL 默认以分号为结束符。 当我们创建存储过程或者自定…

istio api_Istio的网络API解释了

istio apiIstio 1.0版附带一个网络API&#xff0c;该API包含许多功能并涵盖了各种场景。 联网API在最近几个月中得到了发展&#xff0c;并且可能不会立即说明。 该API的概念和构建块是什么&#xff0c;以及如何使用各个Istio资源类型来通过我们的服务网格路由流量&#xff1f; …

MySQL命令之mysqldump的选项详解

文章目录--opt--skip-opt--add-drop-table--add-locks--skip-add-locks--allow-keywords--all-databases,-A--comments--skip-comments--compact--complete-insert,-c--compress,-C--events,-E--compatible--skip-disable-keys,-K--skip-add-drop-table--quick,-q--skip-quick-…

网关限流(令牌桶算法)

一、需求&#xff1a; 每个ip地址1秒内只能发送1次请求&#xff0c;多出来的请求返回429错误。 二、引入依赖 spring cloud gateway 默认使用redis的RateLimter限流算法来实现。所以我们要使用首先需要引入redis的依赖 <!--redis--> <dependency><groupId&g…

openapi_MicroProfile OpenAPI上的Swagger UI

openapiMicroProfile OpenApi为我们提供了一种使用OpenApi 3描述我们JAX-RS API的标准化方法。如果您以前使用过swagger-jaxrs和swagger- 批注 &#xff0c;由于OpenApi是基于Swagger构建的&#xff0c;因此您会感到非常熟悉。 2015年11月5日&#xff0c;SmartBear与3Scale&am…

MySQL的用户表(user)

文章目录字段 host 中的特殊值介绍user 字段中的特殊值介绍我们查看下这张表的字段 host 和 user&#xff0c;如下所示&#xff1a; mysql> select host,user from user; ----------------------------- | host | user | ----------------------------- |…

BCrypt管理员登录密码验证

一、简单入门测试 BCrypt不支持反运算&#xff0c;只支持密码校验 package com.william.test;import org.springframework.security.crypto.bcrypt.BCrypt;/*** author &#xff1a;lijunxuan* date &#xff1a;Created in 2019/7/11 11:34* description &#xff1a;* ver…

通用数据库管理工具_了解为什么这个直观的工具是您团队的通用团队管理工具...

通用数据库管理工具每个项目管理工具都试图做同样的工具性工作&#xff1a;保持团队联系&#xff0c;按任务执行和按时完成重大计划。 但是市场变得非常拥挤&#xff0c;并且有充分的理由-没有平台似乎对人们需要看到的东西以及应该如何显示这些信息具有正确的感觉&#xff0c;…

MySQL查询结果纵向输出标识符\G

\G 这个 G 是 group 的首字母&#xff0c;表示每行记录分组显示。 默认情况下&#xff0c;表数据的查询结果是横向输出的&#xff0c;如下所示&#xff1a; mysql> select * from student; ----------------------------------------------------------------------------…

用jackson转json_用Jackson编写大JSON文件

用jackson转json有时您需要将大量数据导出到JSON到文件中。 也许是“将所有数据导出到JSON”&#xff0c;或者是GDPR“可移植性的权利”&#xff0c;您实际上需要这样做。 与任何大型数据集一样&#xff0c;您不能只将其全部容纳在内存中并将其写入文件。 这需要一段时间&…

JWT 实现微服务鉴权

一、JWT JSON Web Token&#xff08;JWT&#xff09;是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。 一个JWT实际上就是一个字符串&#xff0c;它由三部分组成&#xff0c;头部、载荷与签名。 头部&#xff08;Header&#xff09; 头…

MySQL查看数据库系统正在运行的进程

在 MySQL 5.6 以前&#xff0c;我们通过 show processlist 命令查看系统中正在运行的所有进程&#xff1a; mysql> show processlist; ------------------------------------------------------------------------------------------------ | Id | User | Host …