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

相關文章
相關標籤/搜索