能夠先在用戶變量中保存值而後在之後引用它;這樣能夠將值從一個語句傳遞到另外一個語句。用戶變量與鏈接有關。也就是說,一個客戶端定義的變量不能被其它客戶端看到或使用。當客戶端退出時,該客戶端鏈接的全部變量將自動釋放。html
用戶變量的形式爲@var_name,其中變量名var_name能夠由當前字符集的文字數字字符、‘.’、‘_’和‘$’組成。 默認字符集是cp1252 (Latin1)。能夠用mysqld的--default-character-set選項更改字符集。參見5.10.1節,「數據和排序用字符集」。用戶變量名對大小寫不敏感。mysql
設置用戶變量的一個途徑是執行SET語句:sql
SET @var_name = expr [, @var_name = expr] ...
對於SET,可使用=或:=做爲分配符。分配給每一個變量的expr能夠爲整數、實數、字符串或者NULL值。服務器
也能夠用語句代替SET來爲用戶變量分配一個值。在這種狀況下,分配符必須爲:=而不能用=,由於在非SET語句中=被視爲一個比較 操做符:session
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 |
+----------------------+------+------+------+
用戶變量能夠用於表達式中。目前不包括明顯須要文字值的上下文中,例如SELECT語句的LIMIT子句,或者LOAD DATA語句的IGNORE number LINES子句。spa
若是使用沒有初始化的變量,其值是NULL。.net
若是用戶變量分配了一個字符串值,其字符集和校對規則與該字符串的相同。用戶變量的可壓縮性(coercibility)是隱含的。(即爲表列值的相同的可壓縮性(coercibility)。命令行
註釋:在SELECT語句中,表達式發送到客戶端後才進行計算。這說明在HAVING、GROUP BY或者ORDER BY子句中,不能使用包含SELECT列表中所設的變量的表達式。例如,下面的語句不能定期望工做:htm
mysql> SELECT (@aa:=id) AS a,(@aa+3) AS b 從tbl_name HAVING b=5;
HAVING子句中引用了SELECT列表中的表達式的別名,使用@aa。不能定期望工做:@aa不包含當前行的值,而是前面所選的行的id值。排序
通常原則是不要在語句的一個部分爲用戶變量分配一個值而在同一語句的其它部分使用該變量。可能會獲得指望的結果,但不能保證。
設置變量並在同一語句中使用它的另外一個問題是變量的默認結果的類型取決於語句前面的變量類型。下面的例子說明了該點:
mysql> SET @a='test';
mysql> SELECT @a,(@a:=20) FROM tbl_name;
對於該 SELECT語句,MySQL向客戶端報告第1列是一個字符串,而且將@a的全部訪問轉換爲字符串,即便@a在第2行中設置爲一個數字。執行完SELECT語句後,@a被視爲下一語句的一個數字。
要想避免這種問題,要麼不在同一個語句中設置並使用相同的變量,要麼在使用前將變量設置爲0、0.0或者''以定義其類型。
未分配的變量有一個值NULL,類型爲字符串。
MySQL能夠訪問許多系統和鏈接變量。當服務器運行時許多變量能夠動態更改。這樣一般容許你修改服務器操做而不須要中止並重啓服務器。
mysqld服務器維護兩種變量。全局變量影響服務器總體操做。會話變量影響具體客戶端鏈接的操做。
當服務器啓動時,它將全部全局變量初始化爲默認值。這些默認值能夠在選項文件中或在命令行中指定的選項進行更改。服務器啓動後,經過鏈接服務器並執行SET GLOBAL var_name語句,能夠動態更改這些全局變量。要想更改全局變量,必須具備SUPER權限。
服務器還爲每一個鏈接的客戶端維護一系列會話變量。在鏈接時使用相應全局變量的當前值對客戶端的會話變量進行初始化。對於動態會話變量,客戶端能夠經過SET SESSION var_name語句更改它們。設置會話變量不須要特殊權限,但客戶端只能更改本身的會話變量,而不能更改其它客戶端的會話變量。
對於全局變量的更改能夠被訪問該全局變量的任何客戶端看見。然而,它隻影響更改後鏈接的客戶的從該全局變量初始化的相應會話變量。不影響目前已經鏈接的客戶端的會話變量(即便客戶端執行SET GLOBAL語句也不影響)。
可使用幾種語法形式來設置或檢索全局或會話變量。下面的例子使用了sort_buffer_sizeas做爲示例變量名。
要想設置一個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、SESSION或者LOCAL,默認使用SESSION。參見13.5.3節,「SET語法」。
要想檢索一個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變量被更改了。