mysql中變量分為局部變量、用戶變量、會話變量和全局變量。每種變量的賦值方式,使用方式以及作用范圍都不太一樣。以下詳細介紹這四種類型變量。
一、局部變量
局部變量一般定義在sql語句塊中,如存儲過程的的begin/end。作用范圍也只在這個語句塊中。執行完畢后,就會銷毀。局部變量可以使用declare聲明,default設置默認值。語法如下:
DECLARE 變量名稱 變量類型 DEFAULT 默認值;
DROP PROCEDURE IF EXISTS proc_test_var_loc; CREATE PROCEDURE proc_test_var_loc( ) BEGIN DECLARE t1 INT DEFAULT 1; -- local的變量 SET t1 = t1 +1; SELECT t1 ; END; CALL proc_test_var_loc();
每次調用該存儲過程的結果都是一樣,因為每次執行完該存儲過程,變量都會銷毀。當第二次執行的時候就會重新初始化。
二、用戶變量
用戶變量的作用返回在當前整個連接,當前連接斷開后,變量就會銷毀。用戶變量不需要聲明,直接使用set @變量名即可。語法如下:
set @變量名 = 變量值
set @變量名 :=變量值
DROP PROCEDURE IF EXISTS proc_test_var_user; CREATE PROCEDURE proc_test_var_user() BEGIN SET @var1 = @var1 + 1; -- 變量加一 SET @var2 := @var2 -1; -- 變量減一 SELECT @num1:=(@var1) AS sum, @num2:=(@var2) AS dif; -- 查詢兩個變量的和、差 END; -- 一下兩個語句只需要調用一次 SET @var1 = 1; -- 設置初始值 SET @var2 := 2; -- 設置初始值 CALL proc_test_var_user();
由於用戶變量的作用范圍在整個連接,所以在一次連接中,執行完SET @var1 = 1;SET @var2 := 2;一次之后,每次調用CALL proc_test_var_user();的結果都不一樣。
三、會話變量
會話變量又稱為session變量,會話變量的作用范圍與用戶變量一樣,在當前連接。當連接斷開后,所有的會話變量都被銷毀。
查看會話變量如下:
select @@autocommit; -- 查看一個會話變量 select @@session.autocommit; -- 查看一個會話變量 show session variables like "%bin%"; -- 查看多個會話變量 show session variables; -- 查看所有會話變量
設置會話變量如下:
set session autocommit = 1; set @@session.autocommit = 0; set autocommit = 1; -- 不指定GLOBAL、SESSION或者LOCAL,默認使用SESSION
四、系統變量
全局變量不是由用戶的程序定義的,而是在服務器級定應義的。當
服務器啟動時,將所有全局變量初始化。這些默認值可以在配置文件或在命令行中進行修改的。要想更改全局變量,必須具有超級權限。全局變量作用於服務器的整個生命周期,服務器重新啟動后,設置的變量就會失效。要想讓全局變量重啟后繼續生效,需要更改相應的配置文件。引用全局變量時,必須以“@@”開頭。局部變量的名稱不能與全局變量的名稱相同、否則會在應用中出錯。
查看系統變量如下:
select @@global.autocommit; -- 查看某個系統變量 show global variables like "%bin%"; --查看多個系統變量 show global variables; --查看所有系統變量
設置系統變量如下:
set global autocommit = 1; -- 注意:此處的global不能省略。根據手冊,set命令設置變量時若不指定GLOBAL、SESSION或者LOCAL,默認使用SESSION set @@global.autocommit = 0;
我們使用變量時,盡量使用范圍小的,這樣能盡量減少多次操作直接的影響。