本文對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文檔的理解和總結,如有問題請指正,謝謝)