文件首頁
MySQL 9.0 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 40.0Mb
PDF (A4) - 40.1Mb
手冊頁 (TGZ) - 258.2Kb
手冊頁 (Zip) - 365.3Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 9.0 參考手冊  /  ...  /  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 陳述式,則在將值記錄到一般日誌和稽核日誌之前,會將查詢重寫,以將值替換為 <已編輯>。即使伺服器執行個體上無法使用透過金鑰環元件的安全儲存也是如此。

如果您變更工作階段系統變數,則該值在您的工作階段中仍然有效,直到您將變數變更為不同的值或工作階段結束為止。此變更對其他工作階段沒有影響。

如果您變更全域系統變數,則會記住該值,並用於初始化新工作階段的工作階段值,直到您將變數變更為不同的值或伺服器結束為止。任何存取全域值的用戶端都可以看到此變更。但是,此變更只會影響在變更後連線的用戶端對應的工作階段值。全域變數變更不會影響任何目前用戶端工作階段的工作階段值(甚至包括發生全域值變更的工作階段)。

若要使全域系統變數設定永久有效,以便在伺服器重新啟動後繼續生效,您可以將其保留到資料目錄中的 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 會產生錯誤。大多數範例顯示使用關鍵字語法 (例如,GLOBALSESSION) 的 SET 語句,但這些原則也適用於使用相應修飾符 (例如,@@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 不同,後者一律會參考會期值。