MySQL/Language/User Variables

維基教科書,自由的教學讀本

局部變量[編輯]

局部變量(不以@為前綴)是強類型的,並且被限定在被聲明的存儲的程序塊中。局部變量不能在函數或存儲過程之外訪問。[1].

舉例[2]:

DECLARE MyVariable1 INT DEFAULT 1;

用戶Session變量[編輯]

Session變量(以@為前綴)是鬆散鍵入並限定在會話中。變量名對大小寫不敏感。既不需要也不能被聲明,只需直接使用它們即可。

執行SET語句使用=或:=來賦值:

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

expr可以為整數、實數、字符串或者NULL值。需要以括號括起查詢,以便將其作為子查詢執行:

SET @countTotal = (SELECT COUNT(*) FROM nGrams);

可以使用SELECT ... INTO:

 SELECT COUNT(*) INTO @countTotal FROM nGrams;

 SET @id = 0, @name = '';
 SELECT id, name INTO @id, @name FROM table1 limit 1;
 SELECT @id, @name;

也可以用語句代替SET來為用戶變量分配一個值。在這種情況下,分配符必須為:=而不能用=,因為在非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 |
+----------------------+------+------+------+
  • 沒有初始化的變量,其值是NULL。
  • 在SELECT語句中,表達式發送到客戶端後才進行計算。這說明在HAVING、GROUP BY或者ORDER BY子句中,不能使用包含SELECT列表中所設的變量的表達式。
  • 一般原則是不要在語句的一個部分為用戶變量分配一個值而在同一語句的其它部分使用該變量。可能會得到期望的結果,但不能保證。
 select @test := 2;
 select @test + 1;  -- returns 3

 set @startdate='some_start_date', @enddate='some_end_date'

 SELECT @toremember:=count(*) FROM membros;
	
 select @numzero := count(*) from table1 where field=0; 
 select @numdistinct := count(distinct field) from table1 where field <> 0 ; 
 select @numzero @numdistinct;

系統變量[編輯]

設置一個GLOBAL變量的值,使用下面的語法:

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

要想設置一個SESSION變量的值,使用下面的語法:

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

LOCAL是SESSION的同義詞。

要想檢索一個GLOBAL變量的值,使用下面的語法:

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

要想檢索一個SESSION變量的值,使用下面的語法:

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

這裡,LOCAL也是SESSION的同義詞。

用SELECT @@var_name搜索一個變量時(也就是說,不指定global.、session.或者local.),MySQL返回SESSION值(如果存在),否則返回GLOBAL值。

對於SHOW VARIABLES,如果不指定GLOBAL、SESSION或者LOCAL,MySQL返回SESSION值。

當設置GLOBAL變量需要GLOBAL關鍵字但檢索時不需要它們的原因是防止將來出現問題。如果我們移除一個與某個GLOBAL變量具有相同名字的SESSION變量,具有SUPER權限的客戶可能會意外地更改GLOBAL變量而不是它自己的連接的SESSION變量。如果我們添加一個與某個GLOBAL變量具有相同名字的SESSION變量,想更改GLOBAL變量的客戶可能會發現只有自己的SESSION變量被更改了。

參考文獻[編輯]