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