本文对MySQL中局部变量、用户变量、系统变量的理解进行总结。mysql
局部变量由DECLARE语句声明:sql
DECLARE var_name[,...] type [DEFAULT value]
默认值由DEFAULT子句来声明,默认值也能够是一个表达式。服务器
局部变量的做用范围仅限在它被声明的BEGIN...END块内,当语句执行完毕,局部变量就消失了。session
能够先在用户变量中保存值而后在之后引用它;这样能够将值从一个语句传递到另外一个语句。用户变量与链接有关。也就是说,一个客户端定义的变量不能被其它客户端看到或使用。当客户端退出时,该客户端链接的全部变量将自动释放。用户变量名对大小写不敏感!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 | +----------------------+------+------+------+
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';
注意:
SELECT...INTO语句
SELECT col_name[,...] INTO var_name[,...] table_expr
这个SELECT语法把选定的列直接存储到变量
用户变量是用户定义的变量,是MySQL服务器定义和维护的变量,因此用户变量和会话变量之间的区别在于,是谁在维护这些变量。用户变量和系统会话变量在当前客户端退出后都会自动释放。而系统会话变量的不通之处在于,在客户端创建链接时会建立一系列会话变量,并以全局变量的当前值初始化会话变量(会话变量至关于系统全局变量的副本),对系统会话变量的操做修改仅对当前客户端产生影响,并不会修改系统全局变量。自定义的会话变量的特性与用户变量就没有什么区别了。
(我的参考MySQL文档的理解和总结,如有问题请指正,谢谢)