SET variable = expr [, variable = expr] ...
variable: {
user_var_name
| param_name
| local_var_name
| {GLOBAL | @@GLOBAL.} system_var_name
| {PERSIST | @@PERSIST.} system_var_name
| {PERSIST_ONLY | @@PERSIST_ONLY.} system_var_name
| [SESSION | @@SESSION. | @@] system_var_name
}
SET
語法用於變數賦值,可讓您將值指派給影響伺服器或用戶端操作的不同類型變數。
使用者定義變數。請參閱 第 11.4 節,「使用者定義變數」。
預存程序和函數參數,以及預存程式區域變數。請參閱 第 15.6.4 節,「預存程式中的變數」。
系統變數。請參閱 第 7.1.8 節,「伺服器系統變數」。系統變數也可以在伺服器啟動時設定,如 第 7.1.9 節,「使用系統變數」所述。
指派變數值的 SET
語句不會寫入二進位日誌,因此在複製情境中,它只會影響您執行該語句的主機。若要影響所有複製主機,請在每個主機上執行該語句。
以下各節說明用於設定變數的 SET
語法。它們使用 =
指派運算子,但 :=
指派運算子也允許用於此目的。
使用者定義變數是在會話內本機建立的,且僅存在於該會話的內容中;請參閱 第 11.4 節,「使用者定義變數」。
使用者定義變數寫為 @
,並指派運算式值,如下所示var_name
SET @var_name = expr;
範例
SET @name = 43;
SET @total_tax = (SELECT SUM(tax) FROM taxable_transactions);
如這些語句所示,expr
的範圍可以從簡單 (常值) 到更複雜 (純量子查詢傳回的值)。
效能結構描述 user_variables_by_thread
表格包含有關使用者定義變數的資訊。請參閱 第 29.12.10 節,「效能結構描述使用者定義變數表格」。
SET
適用於定義它們的預存物件內容中的參數和區域變數。以下程序使用 increment
程序參數和 counter
區域變數
CREATE PROCEDURE p(increment INT)
BEGIN
DECLARE counter INT DEFAULT 0;
WHILE counter < 10 DO
-- ... do work ...
SET counter = counter + increment;
END WHILE;
END;
MySQL 伺服器維護設定其操作的系統變數。系統變數可以具有影響整個伺服器操作的全域值、影響目前會話的會話值,或兩者都有。許多系統變數是動態的,可以在執行時間使用 SET
語句變更,以影響目前伺服器執行個體的操作。SET
也可用於將某些系統變數保存到資料目錄中的 mysqld-auto.cnf
檔案,以影響後續啟動的伺服器操作。
如果針對敏感系統變數發出 SET
語句,查詢會被重寫以將值替換為 「<redacted>
」,然後再記錄到一般日誌和稽核日誌中。即使伺服器執行個體上無法透過金鑰環元件進行安全儲存,也會發生這種情況。
如果您變更會話系統變數,該值會在您的會話中保持有效,直到您將變數變更為不同的值或會話結束。該變更不會影響其他會話。
如果您變更全域系統變數,該值會被記住並用於初始化新會話的會話值,直到您將變數變更為不同的值或伺服器結束。任何存取全域值的用戶端都可以看到該變更。但是,該變更只會影響在變更後連線的用戶端的對應會話值。全域變數變更不會影響任何目前用戶端會話的會話值 (甚至包括發生全域值變更的會話)。
若要讓全域系統變數設定永久生效,以便在伺服器重新啟動時適用,您可以將其保存到資料目錄中的 mysqld-auto.cnf
檔案。也可以透過手動修改 my.cnf
選項檔案來進行永久設定變更,但這樣做比較麻煩,而且手動輸入的設定中的錯誤可能要晚得多才會發現。SET
語句保存系統變數更方便,而且可以避免設定格式錯誤的可能性,因為語法錯誤的設定不會成功,而且不會變更伺服器設定。如需有關保存系統變數和 mysqld-auto.cnf
檔案的詳細資訊,請參閱 第 7.1.9.3 節,「保存的系統變數」。
設定或保存全域系統變數值一律需要特殊權限。設定會話系統變數值通常不需要特殊權限,而且任何使用者都可以執行,但也有例外情況。如需詳細資訊,請參閱 第 7.1.9.1 節,「系統變數權限」。
以下討論說明設定和保存系統變數的語法選項
若要將值指派給全域系統變數,請在變數名稱前面加上
GLOBAL
關鍵字或@@GLOBAL.
限定詞SET GLOBAL max_connections = 1000; SET @@GLOBAL.max_connections = 1000;
若要將值指派給會話系統變數,請在變數名稱前面加上
SESSION
或LOCAL
關鍵字、@@SESSION.
、@@LOCAL.
或@@
限定詞,或完全不加關鍵字或修改符SET SESSION sql_mode = 'TRADITIONAL'; SET LOCAL sql_mode = 'TRADITIONAL'; SET @@SESSION.sql_mode = 'TRADITIONAL'; SET @@LOCAL.sql_mode = 'TRADITIONAL'; SET @@sql_mode = 'TRADITIONAL'; SET sql_mode = 'TRADITIONAL';
用戶端可以變更自己的會話變數,但不能變更任何其他用戶端的會話變數。
若要將全域系統變數保存到資料目錄中的
mysqld-auto.cnf
選項檔案,請在變數名稱前面加上PERSIST
關鍵字或@@PERSIST.
限定詞SET PERSIST max_connections = 1000; SET @@PERSIST.max_connections = 1000;
此
SET
語法可讓您在執行時間進行設定變更,這些變更也會在伺服器重新啟動時持續存在。與SET GLOBAL
類似,SET PERSIST
會設定全域變數執行時間值,也會將變數設定寫入mysqld-auto.cnf
檔案 (如果存在,則取代任何現有的變數設定)。若要將全域系統變數保存到
mysqld-auto.cnf
檔案,而不設定全域變數執行時間值,請在變數名稱前面加上PERSIST_ONLY
關鍵字或@@PERSIST_ONLY.
限定詞SET PERSIST_ONLY back_log = 100; SET @@PERSIST_ONLY.back_log = 100;
與
PERSIST
類似,PERSIST_ONLY
會將變數設定寫入mysqld-auto.cnf
。但是,與PERSIST
不同,PERSIST_ONLY
不會修改全域變數執行時間值。這使得PERSIST_ONLY
適用於設定只能在伺服器啟動時設定的唯讀系統變數。
若要將全域系統變數值設定為編譯到 MySQL 的預設值,或將會話系統變數設定為目前的對應全域值,請將變數設定為值 DEFAULT
。例如,以下兩個語句在將 max_join_size
的會話值設定為目前的全域值時是相同的
SET @@SESSION.max_join_size = DEFAULT;
SET @@SESSION.max_join_size = @@GLOBAL.max_join_size;
使用 SET
將全域系統變數保存為 DEFAULT
值或其常值預設值,會將變數指派為其預設值,並將變數設定新增至 mysqld-auto.cnf
。若要從檔案中移除變數,請使用 RESET PERSIST
。
某些系統變數無法保存,或受到保存限制。請參閱 第 7.1.9.4 節,「無法保存和受到保存限制的系統變數」。
如果執行 SET
語句時已安裝外掛程式,則可以保存由外掛程式實作的系統變數。如果外掛程式仍然安裝,則保存的外掛程式變數的指派會在後續伺服器重新啟動時生效。如果外掛程式不再安裝,則當伺服器讀取 mysqld-auto.cnf
檔案時,該外掛程式變數將不再存在。在這種情況下,伺服器會將警告寫入錯誤日誌並繼續。
currently unknown variable 'var_name'
was read from the persisted config file
若要顯示系統變數名稱和值
請使用
SHOW VARIABLES
語句;請參閱 第 15.7.7.40 節,「SHOW VARIABLES 語句」。有數個效能結構描述表格提供系統變數資訊。請參閱 第 29.12.14 節,「效能結構描述系統變數表格」。
效能結構描述
variables_info
表格包含資訊,顯示每個系統變數最近一次設定的時間和使用者。請參閱 第 29.12.14.2 節,「效能結構描述 variables_info 表格」。Performance Schema 的
persisted_variables
表格提供了一個 SQL 介面,可存取mysqld-auto.cnf
檔案,使其內容能夠在執行時使用SELECT
陳述式進行檢查。請參閱 第 29.12.14.1 節,「Performance Schema persisted_variables 表格」。
如果 SET
陳述式中的任何變數賦值失敗,則整個陳述式會失敗,且不會變更任何變數,也不會變更 mysqld-auto.cnf
檔案。
在下列描述的情況下,SET
會產生錯誤。大多數範例顯示使用關鍵字語法的 SET
陳述式 (例如,GLOBAL
或 SESSION
),但這些原則也適用於使用對應修飾符的陳述式 (例如,@@GLOBAL.
或 @@SESSION.
)。
使用
SET
(任何變體) 來設定唯讀變數mysql> SET GLOBAL version = 'abc'; ERROR 1238 (HY000): Variable 'version' is a read only variable
使用
GLOBAL
、PERSIST
或PERSIST_ONLY
來設定只有會期值的變數mysql> SET GLOBAL sql_log_bin = ON; ERROR 1228 (HY000): Variable 'sql_log_bin' is a SESSION variable and can't be used with SET GLOBAL
使用
SESSION
來設定只有全域值的變數mysql> SET SESSION max_connections = 1000; ERROR 1229 (HY000): Variable 'max_connections' is a GLOBAL variable and should be set with SET GLOBAL
省略
GLOBAL
、PERSIST
或PERSIST_ONLY
來設定只有全域值的變數mysql> SET max_connections = 1000; ERROR 1229 (HY000): Variable 'max_connections' is a GLOBAL variable and should be set with SET GLOBAL
使用
PERSIST
或PERSIST_ONLY
來設定無法持久化的變數mysql> SET PERSIST port = 3307; ERROR 1238 (HY000): Variable 'port' is a read only variable mysql> SET PERSIST_ONLY port = 3307; ERROR 1238 (HY000): Variable 'port' is a non persistent read only variable
@@GLOBAL.
、@@PERSIST.
、@@PERSIST_ONLY.
、@@SESSION.
和@@
修飾符僅適用於系統變數。嘗試將其應用於使用者定義的變數、預存程序或函式參數,或預存程式區域變數時,會發生錯誤。並非所有系統變數都可以設定為
DEFAULT
。在這種情況下,指派DEFAULT
會導致錯誤。嘗試將
DEFAULT
指派給使用者定義的變數、預存程序或函式參數,或預存程式區域變數時,會發生錯誤。
SET
陳述式可以包含多個變數賦值,並以逗號分隔。此陳述式將值指派給使用者定義的變數和系統變數
SET @x = 1, SESSION sql_mode = '';
如果您在單一陳述式中設定多個系統變數,則陳述式中最近的 GLOBAL
、PERSIST
、PERSIST_ONLY
或 SESSION
關鍵字會用於後續未指定關鍵字的指派。
多重變數賦值範例
SET GLOBAL sort_buffer_size = 1000000, SESSION sort_buffer_size = 1000000;
SET @@GLOBAL.sort_buffer_size = 1000000, @@LOCAL.sort_buffer_size = 1000000;
SET GLOBAL max_connections = 1000, sort_buffer_size = 1000000;
@@GLOBAL.
、@@PERSIST.
、@@PERSIST_ONLY.
、@@SESSION.
和 @@
修飾符僅適用於緊接其後的系統變數,而不適用於任何剩餘的系統變數。此陳述式將 sort_buffer_size
全域值設定為 50000,會期值設定為 1000000
SET @@GLOBAL.sort_buffer_size = 50000, sort_buffer_size = 1000000;
若要在運算式中參照系統變數的值,請使用其中一個 @@
修飾符 (除了運算式中不允許使用的 @@PERSIST.
和 @@PERSIST_ONLY.
)。例如,您可以在 SELECT
陳述式中擷取系統變數值,如下所示
SELECT @@GLOBAL.sql_mode, @@SESSION.sql_mode, @@sql_mode;
在運算式中將系統變數參照為 @@
(使用 var_name
@@
而不是 @@GLOBAL.
或 @@SESSION.
) 會傳回會期值 (如果存在),否則傳回全域值。這與 SET @@
不同,後者始終參照會期值。var_name
= expr