文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
手冊頁 (TGZ) - 258.5Kb
手冊頁 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  用於變數賦值的 SET 語法

15.7.6.1 用於變數賦值的 SET 語法

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 語法用於變數賦值,可讓您將值指派給影響伺服器或用戶端操作的不同類型變數。

指派變數值的 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;
  • 若要將值指派給會話系統變數,請在變數名稱前面加上 SESSIONLOCAL 關鍵字、@@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

若要顯示系統變數名稱和值

SET 錯誤處理

如果 SET 陳述式中的任何變數賦值失敗,則整個陳述式會失敗,且不會變更任何變數,也不會變更 mysqld-auto.cnf 檔案。

在下列描述的情況下,SET 會產生錯誤。大多數範例顯示使用關鍵字語法的 SET 陳述式 (例如,GLOBALSESSION),但這些原則也適用於使用對應修飾符的陳述式 (例如,@@GLOBAL.@@SESSION.)。

  • 使用 SET (任何變體) 來設定唯讀變數

    mysql> SET GLOBAL version = 'abc';
    ERROR 1238 (HY000): Variable 'version' is a read only variable
  • 使用 GLOBALPERSISTPERSIST_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
  • 省略 GLOBALPERSISTPERSIST_ONLY 來設定只有全域值的變數

    mysql> SET max_connections = 1000;
    ERROR 1229 (HY000): Variable 'max_connections' is a
    GLOBAL variable and should be set with SET GLOBAL
  • 使用 PERSISTPERSIST_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 = '';

如果您在單一陳述式中設定多個系統變數,則陳述式中最近的 GLOBALPERSISTPERSIST_ONLYSESSION 關鍵字會用於後續未指定關鍵字的指派。

多重變數賦值範例

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 不同,後者始終參照會期值。