前言
MySQL 變數分為「系統變數」與「使用者變數」兩大類,作用域、生命週期與設定方式截然不同。本文系統整理兩類變數的核心差異、操作語法與實務注意事項。
系統變數
分類與作用域
| 類型 | 關鍵字 | 作用域 | 變更影響範圍 | 持久化 |
| 全域變數 | GLOBAL / @@global. | 伺服器層級 | 所有新連線(現有連線不受影響) | 重啟失效,需寫入設定檔 |
| 會話變數 | SESSION / @@session. | 目前連線 | 僅目前連線 | 連線結束即失效 |
關鍵特性
- 每個系統變數皆有編譯時預設值。
- 啟動時可透過命令列參數或設定檔(
my.cnf/my.ini)指定。
- 運行時多數可用
SET 動態調整:SET GLOBAL var=value; 或 SET SESSION var=value;。
- 動態修改不跨重啟,永久生效請修改設定檔。
常見操作範例
-- 查看所有系統變數
SHOW VARIABLES;
-- 查看特定變數
SHOW VARIABLES LIKE 'max_connections';
-- 設定全域變數(需 SUPER 權限)
SET GLOBAL max_connections = 500;
-- 設定會話變數
SET SESSION sort_buffer_size = 4194304;
使用者變數
定義與特性
- 格式:
@var_name(前綴 @)。
- 名稱可含字母、數字、
.、_、$,預設字符集 cp1252,不區分大小寫。
- 連線專屬: 一個客戶端定義的變數,其他客戶端不可見/不可用。
- 連線結束自動釋放。
- 跨陳述式傳遞值:在一條語句設定,後續語句引用。
設定與使用
-- 方式 1:SET 語句
SET @my_var = 100;
SET @name = 'John';
-- 方式 2:SELECT ... INTO
SELECT MAX(id) INTO @max_id FROM users;
-- 引用
SELECT @my_var, @name, @max_id;
典型應用場景
- 預存程序/函數間傳遞參數。
- 動態視圖過濾條件(參見「MySQL 動態視圖實作」)。
- 複雜查詢中間結果暫存。
核心差異速查表
| 維度 | 系統變數 | 使用者變數 |
| 前綴 | 無(或 @@) | @ |
| 作用域 | GLOBAL / SESSION | 目前連線 |
| 可見性 | 全域可見 / 會話可見 | 僅目前連線可見 |
| 持久化 | 設定檔永久,SET 暫時 | 連線結束即失效 |
| 用途 | 伺服器行為配置 | 應用邏輯資料暫存 |
相關延伸閱讀
- 帶您深入了解 MySQL 使用者連線
- MySQL 查詢亂碼解決方法
- 教您如何 MySQL 查詢時間區間
- 使用 LIMIT 參數優化 MySQL 查詢
- 使用 MySQL 臨時表加速查詢