您的位置:首页 > 数据库 > MySQL

MySQL中的变量定义及区别

2015-08-06 11:23 204 查看
MySQL数据库中的变量分两种:系统变量和用户变量,其中系统变量又分为全局变量(global)、会话变量(session),以下将针对这几种变量进行说明。

全局变量

概述:它主要影响服务器的整体操作。当服务器启动时,它将所有全局变量初始化为默认值。这些默认值可以在选项文件中或在命令行中对指定的选项进行更改。要想更改全局变量,必须具有SUPER权限。全局变量作用于server的整个生命周期,但是不能跨重启。即重启后所有设置的全局变量均失效。要想让全局变量重启后继续生效,需要更改相应的配置文件。

修改某个全局变量,有如下两种方式:

//注意:此处的global不能省略。SET命令设置变量时,若不指定GLOBAL、SESSION或者LOCAL,默认使用SESSION
第一种:set global var_name = value;
第二种:set @@global.var_name = value;


查看某个全局变量,有如下两种方式:

第一种:select @@global.var_name;
第二种:show global variables like "%var%";


全局变量的相关应用场景:

1、在编写存储过程、函数的sql语句中,经常会使用一些业务相关的全局变量。经常编写业务相关的存储过程、函数的时候,可能需要针对不同的业务,设置能共享访问的全局变量。

例:公司总人数,很多存储过程都需要调用该值,但它不是经常变化的,因此不需要每次使用都进行count,因此可以考虑将它进行cache,那么mysql提供的全局变量,则是较好的存储场所。

2、数据库配置中心

针对于应用系统,用于存储数据的数据库层是必不可少的,那么如何让数据库针对于当前应用系统进行高效、稳定的运行呢?其中的一种方式就是在数据库配置中心,针对数据库的各项参数进行配置。

相信大家应该都知道,当前的应用软件的配置基本上都是用配置文件或配置服务器来实现的,前者是需要与应用系统打包、部署,后者只需要在应用初始化或运行时,去配置中心取配置就OK了。

另数据库配置中心,其实类似配置服务器,灵活运用了mysql的变量机制,继承配置服务器的多数优点,但最大的特色就是在sql语句,函数,存储过程中都可以很方便地引用,相对于用表的方式,要方便一些,并且它本身就具有缓存,移植的话,mysql的导出会很快。因此针对于小型系统,想快速的搭建一个配置中心,利用mysql是不错的选择。

示例1:通过配置的全局变量admin_id来获取用户信息 
select * from user_info where id = @@global.admin_id


注:

1、mysql中,只有部分变量是支持运行时动态修改的;

2、变量修改的作用范围是重新创建连接到mysql服务器的客户端连接;

3、如果连接是由应用通过连接池来维护,并且是长连接的,那么此时在服务器运行过程中,动态地修改全局变量对它是没有什么影响的。

会话变量

概述:服务器为每个连接的客户端维护一系列会话变量。在客户端连接时,使用相应全局变量的当前值对客户端的会话变量进行初始化。设置会话变量不需要特殊权限,但客户端只能更改自己的会话变量,而不能更改其它客户端的会话变量。会话变量的作用域与用户变量一样,仅限于当前连接。当前连接断开后,其设置的所有会话变量均失效

例:服务器会话变量autocommit 默认为true,如果在非长连接的客户端将它设置为false,那么在执行完sql后,连接就会断开。此后,如果创建新的连接来执行sql,autocommit又会默认true。

会话变量的使用场景与全局变量类似,只是生命周期不同,因此可以用来统计同一连接内请求sql次数, sql类型等信息。

session变量的一些常用操作:

//设置序列的增长值
set session auto_increment_increment=1;
//如果不指明, 默认使用session变量
show variables; or show session variables;
//查询包含test字符串的session变量
show variables like ‘%test%’ or show session variables lile ‘%test%’


用户变量

概述:可以作用于当前整个连接,如果当前连接断开,则其所定义的用户变量都会被释放。

用户变量使用方法如下:

//无须使用declare关键字进行定义,可以直接使用
select @变量名
对用户变量赋值有两种方式:
第一种:直接用"="号
第二种:另一种是用":="号。


以上两种赋值的区别在于使用set命令对用户变量进行赋值时,两种方式都可以使用;当使用select语句对用户变量进行赋值时,只能使用”:=”方式,因为在select语句中,”=”号被看作是比较操作符。

示例1:
drop procedure if exists courseSum;
create procedure courseSum
(
in a int,
in b int
)
begin
set @var1 = 99;
set @var2 = 90;
select @sum:=(a + b + @var1 + @var2) as sum;
end;


应用场景:同一连接未关闭情况下,暂存一些计算结果。

示例1:以下两条sql语句在同一连接中完成.
select @admin_id:=max(id) from user_info;
select * from user_info where id = @admin_id
注:用户变量前只有1个@,2个@用于存取全局变量


局部变量

概述:一般用在sql语句块中,比如存储过程的begin/end。其作用域仅限于该语句块,在该语句块执行完毕后,局部变量就消失了。

局部变量一般用declare来声明,可以使用default来说明默认值。

示例:在存储过程中定义局部变量
drop procedure if exists courseSum;
create procedure courseSum
(
in a int,
in b int
)
begin
declare c int default 0;
set c = a + b;
select c as c;
end;
在上述存储过程中定义的变量c就是局部变量,作用范围在begin/end之间


结构化系统变量

如果业务相关的变量定义太多,无法区分系统全局变量,此时应如何处理呢?该问题可以通过mysql提供的结构化系统变量来解决。

结构化系统变量有独特的表示形式:instance_name.test_var

相比一般的变量,多了一个instance_name。这样,你就可以很方便地对他们进行分类。

例如:app.test_var,就可以区别于系统的var
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: