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 [:]=值;
SELECT 值 INTO 变量名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变量学习的主要内容,如果未能解决你的问题,请参考以下文章