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)
自定义变量
变量由用户自定义的,而不是系统提供的。
使用步骤;
- 声明
- 赋值
- 使用(查看、比较、运算)
分类
- 用户变量
- 局部变量
用户变量
作用域
针对当前会话(连接)有效,作用域同会话变量。
用户变量可以在任何地方使用也就是既可以在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中delimit命令。
这个命令与存储过程没什么关系。
其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了。
即改变输入结束符。
默认情况下,delimiter是分号“;”。
在命令行客户端中,如果有一行命令以分号结束,
那么回车后,mysql将会执行该命令。
但有时候,不希望MySQL这么做。因为可能输入较多的语句,且语句中包含有分号。
默认情况下,不可能等到用户把这些语句全部输入完之后,再执行整段语句。
因为mysql一遇到分号,它就要自动执行。
这种情况下,就可以使用delimiter,把delimiter后面换成其它符号,如//或$$。
此时,delimiter作用就是对整个小段语句做一个简单的封装。
此命令多用在定义子程序,触发程序等mysql自己内嵌小程序中。
用户变量和局部变量对比
作用域 | 定义位置 | 语法 | |
---|---|---|---|
用户变量 | 当前会话 | 会话的任何地方 | 加@符号,不用指定类型 |
局部变量 | 定义他的begin end之间 | begin end中的第一句话 | 不加@符号,要指定类型 |
总结
- 系统变量可以设置系统的配置信息,数据库重启之后会还原
- 会话变量可以设置当前会话的一些配置信息,对当前会话起效
- declare创建的局部变量常用于存储过程和函数的创建
- 作用域:全局变量对整个系统有效、会话变量作用于当前会话、用户变量作用于当前会话、局部变量作用于begin end之间
- 系统变量(全局和会话)用@@,用户变量用@,而局部变量不用
- delimiter 关键字用来声明脚本的结束符