一、局部變量
- 語法:
DECLARE var_name[,...] type [DEFAULT value];
- 僅能在儲存程序/函數
BEGIN...END 塊中定義,必須置於塊首。
- 作用域:僅限當前
BEGIN...END,塊結束即銷毀。
- 範例:
CREATE PROCEDURE add(IN a INT, IN b INT)
BEGIN
DECLARE c INT DEFAULT 0;
SET c = a + b;
SELECT c;
END;
二、用戶變量(@var)
- 定義:
SET @a = 1; 或 SELECT @a := 1;
- 作用域:當前連接會話,斷開連接自動消失。
- 範例:
SET @a = 1; SET @b = 2;
SELECT @sum := (@a + @b), @dif := (@a - @b);
-- 結果:@sum=3, @dif=-1
三、會話變量(@@session.var / @@var)
- 服務器為每個連接維護,連接時從全局變量複製初始值。
- 設置方式:
SET SESSION var_name = value;
SET @@session.var_name = value;
SET var_name = value; -- 默認 SESSION
SELECT @@var_name;
SELECT @@session.var_name;
SHOW SESSION VARIABLES LIKE '%var%';
- 作用域:當前連接,斷開失效。需
SUPER 權限才能修改全局變量,但會話變量無需特殊權限。
四、全局變量(@@global.var)
- 影響服務器整體行為,啟動時從配置文件/命令行初始化。
- 修改需
SUPER 權限:
SET GLOBAL var_name = value;
SET @@global.var_name = value;
SELECT @@global.var_name;
SHOW GLOBAL VARIABLES LIKE '%var%';
- 生命周期:服務器運行期間有效,重啟失效。持久化需修改配置文件(
my.cnf)。
- 注意:
SET 不指定作用域默認為 SESSION,修改全局變量必須顯式寫 GLOBAL。
五、總結對照表
| 類型 | 前綴 | 作用域 | 定義位置 | 權限要求 | 持久化 |
| 局部 | 無 | BEGIN...END | 儲存程序塊首 | 無 | 否 |
| 用戶 | @ | 連接會話 | 任意處 | 無 | 否 |
| 會話 | @@ / @@session. | 連接會話 | 任意處 | 無 | 否 |
| 全局 | @@global. | 全服務器 | 任意處 | SUPER | 需改配置文件 |