MySQL变量

MySQL变量

查看配置文件中定义的变量:

shell> mysqld --help --verbose

变量分类

mysql变量可分为两大类,即系统变量和用户自定义变量。

  • 用户自定义变量
    • 局部变量
    • 会话变量
  • 系统变量
    • 会话变量
    • 全局变量

系统变量

系统变量由系统定义的变量

系统变量分类:

  • 全局变量
  • 会话变量

查看系统变量

#查看全局变量
show global variables;

#查看会话变量(默认)
show session variables;
show variables;

查看满足条件的系统变量

通过like模糊匹配

mysql> show global variables like '%transaction%iso%';
+-----------------------+--------------+
| Variable_name         | Value        |
+-----------------------+--------------+
| transaction_isolation | SERIALIZABLE |
+-----------------------+--------------+
1 row in set (0.00 sec)

查看指定的系统变量

@指的是用户自定义变量

@@指的是global或session变量 (@@global @@session ),也就是系统变量

-- 查看指定的系统变量
select @@[global.|session.]系统变量名称;

-- 例子
mysql> select @@global.transaction_isolation;
+--------------------------------+
| @@global.transaction_isolation |
+--------------------------------+
| SERIALIZABLE                   |
+--------------------------------+
1 row in set (0.00 sec)

赋值

#方式1
set [global|session] 系统变量名=值;

#方式2
set @@[global.|session.]系统变量名=值;

注意:

上面使用中介绍的,全局变量需要添加global关键字,会话变量需要添加session关键字,如果不写,默认为session级别。

系统变量(全局变量和会话变量)的使用 @@ ,自定义变量中使用一个 @ 符号

全局变量

mysql全局变量,全局变量影响服务器整体操作,当服务启动时,它将所有全局变量初始化为默认值。要想更改全局变量,必须具有super权限。

作用域

作用域为server的整个生命周期

mysql服务器每次启动都会为所有的系统变量设置初始值。

我们为系统变量赋值,针对所有会话(连接)有效,可以跨连接,但不能跨重启,重启之后,mysql服务器会再次为所有系统变量赋初始值。

示例

查看所有全局变量

/*查看所有全局变量*/ 
show global variables;

查看包含

/*查看包含iso字段的变量*/
mysql> show global variables like '%iso%';
+-----------------------+--------------+
| Variable_name         | Value        |
+-----------------------+--------------+
| transaction_isolation | SERIALIZABLE |
| tx_isolation          | SERIALIZABLE |
+-----------------------+--------------+
2 rows in set (0.00 sec)

/*查看指定名称的系统变量的值,如查看事务默认自动提交设置*/
mysql> select @@global.autocommit;
+---------------------+
| @@global.autocommit |
+---------------------+
|                   1 |
+---------------------+
1 row in set (0.00 sec)

为某个变量赋值

/*为某个系统变量赋值*/ 
set global autocommit=0;
set @@global.autocommit=1;
mysql> set global autocommit=0;
Query OK, 0 rows affected (0.00 sec)

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


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

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

会话变量

作用域

针对当前会话(连接)有效,不能跨连接。

会话变量是在连接创建时由mysql自动给当前会话设置的变量。

示例

查看所有会话

/*①查看所有会话变量*/
show session variables;

查看满足条件的会话变量

/*②查看满足条件的步伐会话变量*/ 
/*查看包含`char`字符变量名的会话变量*/ 
show session variables like '%char%';

查看指定的会话变量的值

/*③查看指定的会话变量的值*/ 
/*查看事务默认自动提交的设置*/ 
select @@autocommit;
select @@session.autocommit;
/*查看事务隔离级别*/ 
select @@transaction_isolation;
select @@session.transaction_isolation;

给某个会话变量赋值

/*④为某个会话变量赋值*/ 
set @@session.tx_isolation='read-uncommitted';
set @@tx_isolation='read-committed';
set session tx_isolation='read-committed';
set tx_isolation='read-committed';

示例;

mysql> select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE   |
+----------------+
1 row in set, 1 warning (0.00 sec)

mysql> set tx_isolation='read-committed';
Query OK, 0 rows affected, 1 warning (0.00 sec)

mysql> select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| READ-COMMITTED |
+----------------+
1 row in set, 1 warning (0.00 sec)

自定义变量

变量由用户自定义的,而不是系统提供的。

使用步骤;

  1. 声明
  2. 赋值
  3. 使用(查看、比较、运算)

分类

  • 用户变量
  • 局部变量

用户变量

作用域

针对当前会话(连接)有效,作用域同会话变量。

用户变量可以在任何地方使用也就是既可以在begin end里面使用,也可以在他外面使用。

使用

声明并初始化

声明时要求必须初始化

/*方式1*/ 
set @变量名=值;
/*方式2*/
set @变量名:=值;
/*方式3*/
select @变量名:=值;

再次注意:

系统变量使用@@,用户变量使用@

上面set中=号前面的冒号是可选的,select方式的=前面必须有冒号

赋值(更新变量的值)

/*方式1:这块和变量的声明一样*/
set @变量名=值;
set @变量名:=值;
select @变量名:=值;

/*方式2*/
select 字段 into @变量名 from 表;

注意上面select的两种方式。

查看值

select @变量名;

例子

/*set方式创建变量并初始化*/
mysql> select @testname;
+-----------+
| @testname |
+-----------+
| NULL      |
+-----------+
1 row in set (0.00 sec)

/*赋值*/
mysql> set @testname='alice';
Query OK, 0 rows affected (0.00 sec)

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


/*select into的方式创建变量*/
mysql> select 'toma' into @testname1;
Query OK, 1 row affected (0.00 sec)

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

mysql> select count(*) into @testcount from employees;
Query OK, 1 row affected (0.00 sec)

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



/*select :=方式创建变量*/
select @first_name:='陈致逸',@email:='123456789@qq.com';

mysql> insert into employees(first_name,email) values(@first_name,@email);
Query OK, 1 row affected (0.00 sec)

mysql> select * from employees where first_name = '陈致逸' and email='123456789@qq.com'\G
*************************** 1. row ***************************
   employee_id: 207
    first_name: 陈致逸
     last_name: NULL
         email: 123456789@qq.com
  phone_number: NULL
        job_id: NULL
        salary: NULL
commission_pct: NULL
    manager_id: NULL
 department_id: NULL
      hiredate: NULL
1 row in set (0.00 sec)

1 row in set (0.00 sec)


局部变量

作用域

declare用于定义局部变量变量,在存储过程和函数中通过declare定义变量在begin...end中,且在语句之前。并且可以通过重复定义多个变量

declare变量的作用范围同编程里面类似,在这里一般是在对应的begin和end之间。在end之后这个变量就没有作用了,不能使用了。这个同编程一样。

也就是说局部变量的作用域仅仅在定义他的begin end中有效

使用:

声明

declare 变量名 变量类型;
declare 变量名 变量类型 [default 默认值];

赋值

/*方式1*/ 
set 局部变量名=值;
set 局部变量名:=值;
select 局部变量名:=值;

/*方式2*/
select 字段 into 局部变量名 from 表;

注意没有@符号

使用(查看变量的值)

select 局部变量名;

示例

/*创建表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 ; 

/*调用存储过程*/ 
mysql> call proc1();
+-------------+
| @v_b:=v_a*2 |
+-------------+
|           2 |
+-------------+

/*查看结果*/ 
mysql> select * from test1;
+---+------+
| a | b    |
+---+------+
| 1 |    2 |
+---+------+
1 row in set (0.00 sec)

delimiter关键字

参考:MySql中 delimiter 详解

MySQL中delimit命令。

这个命令与存储过程没什么关系。

其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。

即改变输入结束符。

默认情况下,delimiter是分号“;”。

在命令行客户端中,如果有一行命令以分号结束,

那么回车后,mysql将会执行该命令。

但有时候,不希望MySQL这么做。因为可能输入较多的语句,且语句中包含有分号。

默认情况下,不可能等到用户把这些语句全部输入完之后,再执行整段语句。

因为mysql一遇到分号,它就要自动执行。

这种情况下,就可以使用delimiter,把delimiter后面换成其它符号,如//或$$。

此时,delimiter作用就是对整个小段语句做一个简单的封装。

此命令多用在定义子程序,触发程序等mysql自己内嵌小程序中。

用户变量和局部变量对比

作用域 定义位置 语法
用户变量 当前会话 会话的任何地方 加@符号,不用指定类型
局部变量 定义他的begin end之间 begin end中的第一句话 不加@符号,要指定类型

总结

  • 系统变量可以设置系统的配置信息,数据库重启之后会还原
  • 会话变量可以设置当前会话的一些配置信息,对当前会话起效
  • declare创建的局部变量常用于存储过程和函数的创建
  • 作用域:全局变量对整个系统有效、会话变量作用于当前会话、用户变量作用于当前会话、局部变量作用于begin end之间
  • 系统变量(全局和会话)用@@,用户变量用@,而局部变量不用
  • delimiter 关键字用来声明脚本的结束符
posted @ 2021-07-28 14:16  EverEternity  阅读(399)  评论(0编辑  收藏  举报