Linux学习-MySQL变量学习

Posted 丢爸

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux学习-MySQL变量学习相关的知识,希望对你有一定的参考价值。

变量

  • 系统变量
  • 全局系统变量(需添加global关键字)
  • 会话系统变量(需添加session关键字)
  • 用户自定义变量
系统变量
系统变量分为全局系统变量和会话系统变量,有时也将全局系统变量称为全局变量,会话系统变量称为local变量,如果不指名,默认为会话级别,静态变量属于特殊的全局系统变量。

每一个mysql客户机成功连接MySQL服务器后,都会产生与之对应的会话,会话期间,MySQL服务实例会在MySQL服务器内存中生成与该会话对应的会话系统变量,这些会话系统变量的初使值是全局系统变量值的复制。
- 全局系统变量针对于所有会话(连接)有效,但不能重启
- 会话系统变量仅针对当前会话(连接)有效,会话期间,当前会话对某个会话系统变量值的修改,不会影响其他会话同一个会话系统变量的值
- 会话1对某全局系统变量值的修改会导致会话2中同一个全局系统变量值的修改
注:在MySQL中有些系统变量只能是全局的,例如max_connections用于限制服务器的最大连接数;有些系统变量作用域可以是全局又可以是会话,如character_set_client用于设置客户端的字符集;有些系统变量的作用域只能是当前会话,例如pseudo_thread_id用于标记当前会话的MySQL连接ID。
#查看全局系统变量
mysql> SHOW GLOBAL VARIABLES;
#查看所有会话变量(默认)
mysql> SHOW SESSION VARIABLES;SHOW VARIABLES;
#查看部分系统变量
mysql> SHOW GLOBAL VARIABLES LIKE 'admin_%';
+------------------------+---------+
| Variable_name          | Value   |
+------------------------+---------+
| admin_address          |         |
| admin_port             | 33062   |
| admin_ssl_ca           |         |
| admin_ssl_capath       |         |
| admin_ssl_cert         |         |
| admin_ssl_cipher       |         |
| admin_ssl_crl          |         |
| admin_ssl_crlpath      |         |
| admin_ssl_key          |         |
| admin_tls_ciphersuites |         |
| admin_tls_version      | TLSv1.2 |
+------------------------+---------+
11 rows in set (0.01 sec)
#查询指定系统变量
MySQL中的系统变量以两个"@"开头,其中@@global仅用于标识全局系统变量,"@@session"仅用于标记会话系统变量,"@@"首先标记会话系统变量,如会话系统变量不存在,则标记全局系统变量。
mysql> select @@global.max_connections;
+--------------------------+
| @@global.max_connections |
+--------------------------+
|                      151 |
+--------------------------+
1 row in set (0.00 sec)
mysql> select @@session.character_set_client;
+--------------------------------+
| @@session.character_set_client |
+--------------------------------+
| utf8mb4                        |
+--------------------------------+
1 row in set (0.00 sec)
mysql> select @@session.pseudo_thread_id;
+----------------------------+
| @@session.pseudo_thread_id |
+----------------------------+
|                          8 |
+----------------------------+
1 row in set (0.00 sec)
#修改系统变量的值
#1.修改MySQL配置文件,修改完成后需重启MySQL服务器
#2.在MySQL运行期间,使用SET命令重新设置系统变量的值
#为某个全局系统变量赋值(使用SET设置的系统变量一旦重启服务器将失效)
SET @@global.变量名=变量值
SET GLOBAL 变量名=变量值
mysql> select @@global.max_connections;
+--------------------------+
| @@global.max_connections |
+--------------------------+
|                      151 |
+--------------------------+
1 row in set (0.00 sec)

mysql> set @@global.max_connections=161;
Query OK, 0 rows affected (0.00 sec)

mysql> select @@global.max_connections;
+--------------------------+
| @@global.max_connections |
+--------------------------+
|                      161 |
+--------------------------+
1 row in set (0.00 sec)

#为某个会话变量赋值(针对当前会话有效,一旦会话结束,会话变量失效)
SET @@session.character_set_client='gbk'
SET session character_set_client='gbk'
用户变量

用户变量是用户自已定义的,作为MySQL编码规范,MySQL中的用户变量以一个"@"开头,根据作用范围不同,分为会话用户变量和局部变量。

  • 会话用户变量:作用域和会话变量一样,只对当前连接有效
  • 局部变量:只在BEGIN和END语句块中有效,局部变量只能在存储过程和函数中使用
#变量定义
#方式1:"="或":="
SET @用户变量 =;
SET @用户变量 :=;
#方式2:":="或INTO关键字
SELECT @用户变量:=表达式[FROM 等子句];

mysql> SET @m1 = 1;
Query OK, 0 rows affected (0.01 sec)

mysql> SET @m2 := 2;
Query OK, 0 rows affected (0.00 sec)

mysql> SET @sum := @m1+@m2;
Query OK, 0 rows affected (0.00 sec)

mysql> select @sum;
+------+
| @sum |
+------+
|    3 |
+------+
1 row in set (0.00 sec)

mysql> SELECT @count :=count(*) from employees;
+-------------------+
| @count :=count(*) |
+-------------------+
|               106 |
+-------------------+
1 row in set, 1 warning (0.00 sec)
mysql> select @count;
+--------+
| @count |
+--------+
|    106 |
+--------+
1 row in set (0.00 sec)
mysql> select avg(salary) into @avg_sal from employees;
Query OK, 1 row affected (0.00 sec)

mysql> select @avg_sal;
+--------------------+
| @avg_sal           |
+--------------------+
| 6464.1509433962265 |
+--------------------+
1 row in set (0.00 sec)
#局部变量-可以使用DECLARE语句定义一个局部变量,作用域(仅在定义它的BEGIN...END中有效),位置(只能放在BEGIN...END中,而且只能放在第一句)
BEGIN
  #声明局部变量
  DECLARE 变量名1 变量数据类型[DEFAULT 变量默认值]
  DECLARE 变量名2,变量名3...变量数据类型[DEFAULT 变量默认值]
  #为局部变量赋值
  SET 变量名1 [:]=;
  SELECTINTO 变量名2 [FROM子句]
  #查看局部变量的值
  SELECT 变量1,变量2,变量3;
END

#
mysql> DELIMITER $
mysql> CREATE PROCEDURE test_var() BEGIN DECLARE a INT DEFAULT 0;DECLARE bINT; DECLARE emp_name VARCHAR(25); SET a = 1; SET b :=2; SELECT last_name INNTO emp_name FROM employees WHERE employee_id=101; SELECT a,b,emp_name; END$
Query OK, 0 rows affected (0.04 sec)
mysql> DELIMITER ;
mysql> CALL test_var();
+------+------+----------+
| a    | b    | emp_name |
+------+------+----------+
|    1 |    2 | Kochhar  |
+------+------+----------+
1 row in set (0.00 sec)

Query OK, 0 rows affected (0.00 sec)

以上是关于Linux学习-MySQL变量学习的主要内容,如果未能解决你的问题,请参考以下文章

Linux学习-MySQL之用户管理

2018-05-07 Linux学习

2018-05-07 Linux学习

Linux学习总结(四十五)mysql 基本操作 上篇

Linux学习-- su -和 su的区别深入解析

Linux学习记录:Makefile