MySQL中变量的总结

本文对MySQL中局部变量、用户变量、系统变量的理解进行总结。mysql

1、局部变量

局部变量由DECLARE语句声明:sql

DECLARE var_name[,...] type [DEFAULT value]

默认值由DEFAULT子句来声明,默认值也能够是一个表达式。服务器

局部变量的做用范围仅限在它被声明的BEGIN...END块内,当语句执行完毕,局部变量就消失了。session

 

2、用户变量

能够先在用户变量中保存值而后在之后引用它;这样能够将值从一个语句传递到另外一个语句。用户变量与链接有关。也就是说,一个客户端定义的变量不能被其它客户端看到或使用。当客户端退出时,该客户端链接的全部变量将自动释放。用户变量名对大小写不敏感!spa

对用户变量的定义有两种方式:命令行

第一种是执行SET语句code

SET @var_name = expr [, @var_name = expr] ...

对于SET,能够使用=或:=做为分配符。分配给每一个变量的expr能够为整数、实数、字符串或者NULL值。blog

第二种是使用SELECT语句文档

使用SELECT定义用户变量只能使用:=做为分配符(由于在非SET语句中 = 被视为一个‘比较操做符’)字符串

mysql> SET @t1=0, @t2=0, @t3=0;
mysql> SELECT @t1:=(@t2:=1)+@t3:=4,@t1,@t2,@t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)+@t3:=4 | @t1  | @t2  | @t3  |
+----------------------+------+------+------+
|                    5 |    5 |    1 |    4 |
+----------------------+------+------+------+

3、系统变量

MySQL服务器维护两种变量:全局变量影响服务器总体操做;会话变量影响具体客户端链接的操做。

一、全局变量

当服务器启动时,它将全部全局变量初始化为默认值。这些默认值能够在配置文件(my.ini)中或在命令行中指定的选项进行更改。服务器启动后,经过链接服务器并执行SET GLOBAL var_name语句,能够动态更改这些全局变量。要想更改全局变量,必须具备SUPER权限。

要想设置一个GLOBAL变量的值,使用下面的语法:

mysql> SET GLOBAL sort_buffer_size=value;
mysql> SET @@global.sort_buffer_size=value;

要想查看一个GLOBAL变量的值,使用下面的语法:

mysql> SELECT @@global.sort_buffer_size;
mysql> SHOW GLOBAL VARIABLES like 'sort_buffer_size';

二、会话变量

服务器还为每一个链接的客户端维护一系列会话变量。在链接时使用相应全局变量的当前值对客户端的会话变量进行初始化。对于动态会话变量,客户端能够经过SET SESSION var_name语句更改它们。设置会话变量不须要特殊权限,但客户端只能更改本身的会话变量,而不能更改其它客户端的会话变量。当前链接断开后,其设置的全部会话变量均

会自动释放

要想设置一个SESSION变量的值,使用下面的语法:

mysql> SET SESSION sort_buffer_size=value;
mysql> SET @@session.sort_buffer_size=value;
mysql> SET sort_buffer_size=value;

要想查看一个SESSION变量的值,使用下面的语法:

mysql> SELECT @@sort_buffer_size;
mysql> SELECT @@session.sort_buffer_size;
mysql> SHOW SESSION VARIABLES like 'sort_buffer_size';

 

注意:

  • 对于全局变量的更改能够被访问该全局变量的任何客户端看见。然而,它只影响更改后链接的客户的从该全局变量初始化的相应会话变量。不影响目前已经链接的客户端的会话变量(即便客户端执行SET GLOBAL语句也不影响)。
  • 当你用SELECT @@var_name搜索一个变量时(也就是说,不指定global.、session.),MySQL返回SESSION值(若是存在),不然返回GLOBAL值。
  • 对于SHOW VARIABLES,若是不指定GLOBAL、SESSION或者LOCAL,MySQL返回SESSION值。

通用的赋值方式:

SELECT...INTO语句

SELECT col_name[,...] INTO var_name[,...] table_expr

这个SELECT语法把选定的列直接存储到变量

4、用户变量与会话变量的区别:

用户变量是用户定义的变量,是MySQL服务器定义和维护的变量,因此用户变量和会话变量之间的区别在于,是谁在维护这些变量。用户变量和系统会话变量在当前客户端退出后都会自动释放。而系统会话变量的不通之处在于,在客户端创建链接时会建立一系列会话变量,并以全局变量的当前值初始化会话变量(会话变量至关于系统全局变量的副本),对系统会话变量的操做修改仅对当前客户端产生影响,并不会修改系统全局变量。自定义的会话变量的特性与用户变量就没有什么区别了。

 

 

(我的参考MySQL文档的理解和总结,如有问题请指正,谢谢)

相关文章
相关标签/搜索