1. 程式人生 > >MYSQL的使用者變數(@)和系統變數(@@)

MYSQL的使用者變數(@)和系統變數(@@)

轉自:

http://dev.mysql.com/doc/refman/5.1/zh/language-structure.html#variables

9.3. 使用者變數

可以先在使用者變數中儲存值然後在以後引用它;這樣可以將值從一個語句傳遞到另一個語句。使用者變數與連線有關。也就是說,一個客戶端定義的變數不能被其它客戶端看到或使用。當客戶端退出時,該客戶端連線的所有變數將自動釋放。

使用者變數的形式為@var_name,其中變數名var_name可以由當前字符集的文字數字字元、‘.’、‘_’和‘$’組成。 預設字符集是cp1252 (Latin1)。可以用mysqld--default-character-set

選項更改字符集。參見5.10.1節,“資料和排序用字符集”。使用者變數名對大小寫不敏感。

設定使用者變數的一個途徑是執行SET語句:

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

對於SET,可以使用=:=作為分配符。分配給每個變數的expr可以為整數、實數、字串或者NULL值。

也可以用語句代替SET來為使用者變數分配一個值。在這種情況下,分配符必須為:=而不能用=,因為在非SET語句中=被視為一個比較 操作符:

mysql> SET @t1=0, @t2=0, @t3=0;
mysql> SELECT @t1:=(@t2:=1)
[email protected]
:=4,@t1,@t2,@t3;
+----------------------+------+------+------+
| @t1:=(@t2:=1)[email protected]:=4 | @t1  | @t2  | @t3  |
+----------------------+------+------+------+
|                    5 |    5 |    1 |    4 |
+----------------------+------+------+------+

使用者變數可以用於表示式中。目前不包括明顯需要文字值的上下文中,例如SELECT

語句的LIMIT子句,或者LOAD DATA語句的IGNORE number LINES子句。

如果使用沒有初始化的變數,其值是NULL

如果使用者變數分配了一個字串值,其字符集和校對規則與該字串的相同。使用者變數的可壓縮性(coercibility)是隱含的。(即為表列值的相同的可壓縮性(coercibility)。

註釋:SELECT語句中,表示式傳送到客戶端後才進行計算。這說明在HAVINGGROUP BY或者ORDER BY子句中,不能使用包含SELECT列表中所設的變數的表示式。例如,下面的語句不能按期望工作:

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被視為下一語句的一個數字。

要想避免這種問題,要麼不在同一個語句中設定並使用相同的變數,要麼在使用前將變數設定為00.0或者''以定義其型別。

未分配的變數有一個值NULL,型別為字串。

9.4. 系統變數

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;

LOCALSESSION的同義詞。

如果設定變數時不指定GLOBALSESSION或者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,如果不指定GLOBALSESSION或者LOCALMySQL返回SESSION值。

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

相關推薦

MYSQL的使用者變數(@)系統變數(@@)

轉自:http://dev.mysql.com/doc/refman/5.1/zh/language-structure.html#variables9.3. 使用者變數 可以先在使用者變數中儲存值然後在以後引用它;這樣可以將值從一個語句傳遞到另一個語句。使用者變數

MySQL 會話變數 系統變數

MySQL會話變數  和 系統變數@@ 1、當伺服器執行時很多的變數可以動態改變。 2、客戶端只能更改自己的會話變數,不能更改其他客戶端的會話變數,退出客戶端時變數復原,並且不會影響其他客戶端,系統 變數影響全域性。 3、伺服器啟動時,將全域性變數初始化為預設值,這些預設值可以在配置檔案或命令列中更改。想要更

windows 使用者變數系統變數中的Path差別

  點選“我的電腦→屬性→高階系統設定”標籤的“環境變數”button,出現“環境變數”對話方塊,假設當前是以Administrator登入系統的使用者。對話方塊的上面為Administrator的使用者變數,對話方塊的以下為系統變數(即相當於系統中全部使用者的使用者變數)。

windows 使用者變數系統變數的區別

點選“我的電腦→屬性→高階系統設定”標籤的“環境變數”按鈕,出現“環境變數”對話方塊,如果當前是以Administrator登入系統的使用者,對話方塊的上面為Administrator的使用者變數,對話方塊的下面為系統變數(即相當於系統中所有使用者的使用者變數)。有的時候我們會看到在使用者變數和系統

使用者變數系統變數的區別

   在我們安裝了jdk之後,還無法編譯和執行java(通過在執行選單cmd中輸入java和javac命令可以測試),這是因為還沒有設定環境變數。     windows作業系統根據Path環境變數查詢命令,如果能找到,則執行該命令,否則會出現“xxx不是內部或外部命令,也不是可執行的程式或批處理檔案”。而L

環境變數中administrator的使用者變數系統變數

我們在java執行環境或android開發環境時,經常要配置環境變數,如圖所示, 這裡有administrator的使用者變數(U),和系統變數(S), 那麼,它們之間有什麼區別呢? 簡單的說,一個是當前使用者使用,你用其它使用者登陸,這個環境變數就不起作用了。 系統變數

環境變數:使用者變數系統變數

環境變數的含義 環境變數:一般是指系統和當前使用者可以對操作環境的執行進行相應設定的字串。 在作業系統中,環境變數是一個特定的物件,它包含了系統和當前使用者執行應用程式所需的必要資訊1,如:當前使用者臨時檔案的儲存位置,使用GCC編譯器的路徑等。

環境變數系統變數使用者的環境變數及在配置JAVA環境變數時兩著有什麼區別

環境變數分為系統環境變數和使用者環境變數.你所說的環境變數是指系統環境變數,對所有使用者起作用, 而使用者環境變數只對當前使用者起作用。       例如你要用java,那麼你把java的bin目錄加入到path變數下面,那麼它就是系統環境變數,所用使用者登陸, 在命令列輸入java都會有java的幫助資訊出

mysql:使用者變數系統變數、區域性變數(儲存過程中的)

MySQL資料庫中的變數分為MySQL系統變數和MySQL使用者變數。 一、MySQL使用者變數:基於會話變數實現的, 可以暫存值, 並傳遞給同一連線裡的下一條sql使用的變數.當客戶端連線退出時,變

Java基礎學習總結(114)——System之系統變數環境變數

環境變數這個概念不陌生,就是作業系統的環境變數。系統變數就是Java本身維護的變數。 通過 System.getProperty 的方式獲取。對於不同的作業系統來說, 環境變數的處理可能會有一些不統一

MySQL標準變數、臨時變數系統變數

宣告標準變數 DECLARE end_flag INT DEFAULT 0; 臨時變數@(不需要宣告) 只在區域性起作用 用法一:set @name=value; set @num=1; set @num:=1; 用法二:select @num=

Python3 全域性變數區域性變數的使用

name='lhf' def change_name(): print('我的名字',name) change_name() def change_name(): name='帥了一筆' print('我的名字',name) change_name() print(name) d

java中成員變數區域性變數

1.成員變數   在類中定義,用來描述物件將要有什麼。 2.區域性變數 在類的方法中定義,在方法中臨時儲存資料 成員變數和區域性變數區別 1.作用域不同 成員變數的作用域在整個類內部都是可見的 區域性變數的作用僅限於定義它的方法、 2.初始值不同 jav

C++靜態全域性變數全域性變數的區別

    靜態全域性變數 非靜態全域性變數 儲存方式 靜態儲存 靜態儲存 作用域 定義該變數的原始檔內 所有原始檔   解釋: 共同點:

PHP中的$_GET變數$_POST變數(二)

PHP中的$_GET變數和$_POST變數(二) $_POST變數 $_POST變數是一個數組,內容是由HTTP POST方法傳送的變數名和對應的值 $_POST變數用於收集來自method = "post"的表單中的值。從帶有POST方法

PHP中的$_GET變數$_POST變數(一)

PHP中的$_GET變數和$_POST變數(一) $_GET變數 $_GET變數用於收集來自method=“get"的表單中的值,其中這些值能夠很直觀地在瀏覽器的位址列裡看到,例如,我使用百度搜索“PHP”的時候,瀏覽器發起請求的url為https:

JAVA基礎(11)---成員變數區域性變數

變數的分類: 按照變數宣告的位置(作用的範圍):     成員變數: 宣告在類的內部,方法的外部的變數,稱為成員變數                區域性變數:宣告在方

JS 變數函式提升 全域性變數區域性變數

1. var a = 10; function test() { a = 100; console.log(a); console.log(this.a); var a; console.log(a); } test();//100 10 100 =&

Python千萬要注意的全域性變數區域性變數問題

1、直接在函式中呼叫全域性變數 m = 100 def fun(): print("m1:",m) fun() print("m2:", m)  輸出: 2、函式體內呼叫與全域性變數同名的區域性變數 m = 100 def fun(): m = 50

python--全域性變數區域性變數

區域性變數: 是在函式內部定義的變數,只能在函式內部使用 函式執行結束後,函式的區域性變數,會被系統回收 作用:在函式內部使用,臨時儲存函式內部需要使用的資料 全域性變數: 是在函式外部定義的變數(沒有定義某一個函式內,所有函式都