SET variable_assignment [, variable_assignment] ...
variable_assignment:
user_var_name = expr
| [GLOBAL | SESSION] system_var_name = expr
| @@[global. | session.]system_var_name = expr
SET用于設置不同類型的變量。這些變量會影響服務器或客戶端的操作。SET可以用于向用戶變量或系統變量賦值。
用于分配賬戶密碼的SET PASSWORD語句在13.5.1.5節,“SET PASSWORD語法”中進行了討論。
多數系統變量可以在運行時間被更改。可以被動態設置的系統變量在5.3.3.1節,“動態系統變量”中進行了討論。
注釋:舊版本的MySQL采用SET OPTION作為這個命令,但是由于有了SET,現在不贊成使用SET OPTION。
以下例子顯示了您可以用于設置變量的不同語法。
用戶變量可以被寫作@var_name,并可以進行如下設置:
SET @var_name = expr;
在9.3節,“用戶變量”中給出了有關用戶變量的更多信息。
系統變量可以被作為var_name引用到SET語句中。在名稱的前面可以自選地添加GLOBAL或@@global,以明確地指示該變量是全局變量。或者在名稱前面添加SESSION, @@session,或@@,以指示它是一個會話變量。LOCAL和@@local是SESSION和@@session地同義詞。如果沒有修改符,則SET設置會話變量。
支持系統變量的@@var_name語法,以便使MySQL語法與其它數據庫系統相兼容。
如果您在同一個語句中設置多個系統變量,則最后一個GLOBAL或SESSION選項被用于沒有指定模式的變量。
SET sort_buffer_size=10000;
SET @@local.sort_buffer_size=10000;
SET GLOBAL sort_buffer_size=1000000, SESSION sort_buffer_size=1000000;
SET @@sort_buffer_size=1000000;
SET @@global.sort_buffer_size=1000000, @@local.sort_buffer_size=1000000;
如果您使用SESSION(默認情況)設置一個系統變量,則該值仍然有效,直到當前會話結束為止,或者直到您吧變量設置為一個不同的值為止。如果您使用GLOBAL(要求SUPER權限)來設置一個系統變量,則該值被記住,并被用于新的連接,直到服務器重新啟動為止。如果您想要進行永久式變量設置,您應該把它放入一個選項文件。請參見4.3.2節,“使用選項文件”。
為了防止不正確的使用,如果您使用SET GLOBAL時同時使用了一個只能與SET SESSION同時使用的變量,或者如果您在設置一個全局變量時未指定GLOBAL(或@@),則MySQL會產生一個錯誤。
如果您想要把一個SESSION變量設置為GLOBAL值或把一個GLOBAL值設置為內部MySQL默認值,需使用DEFAULT關鍵詞。例如,在把max_join_size會話值設置為全局值時,以下兩個語句是一樣的:
SET max_join_size=DEFAULT;
SET @@session.max_join_size=@@global.max_join_size;
您可以使用SHOW VARIABLES來得到系統變量清單。(見13.5.4.21節,“SHOW VARIABLES語法”。)要獲得與樣式匹配的一個具體的變量名稱或者名稱清單,需使用LIKE子句,使用方法如下:
SHOW VARIABLES LIKE 'max_join_size';
SHOW GLOBAL VARIABLES LIKE 'max_join_size';
要得到名稱與樣式匹配的變量的清單,需使用通配符‘%’:
SHOW VARIABLES LIKE 'have%';
SHOW GLOBAL VARIABLES LIKE 'have%';
通配符可以被用于相匹配的樣式中的任何位置。
您也可以通過使用@@[global.|local.]var_name語法和SELECT來得到值:
SELECT @@max_join_size, @@global.max_join_size;
當您使用SELECT @@var_name(即您不指定全局、會話或本地)來恢復一個變量時,則MySQL會返回SESSION值(如果存在)或者GLOBAL值。
以下清單用于描述帶有非標準語法的變量,或描述在系統變量清單中(見5.3.3節,“服務器系統變量”。)中沒有描述的變量。盡管這些變量沒有被SHOW VARIABLES顯示,但是您可以使用SELECT來獲得它們的值(例外情況是,使用CHARACTER SET和SET NAMES)。例如:
mysql> SELECT @@AUTOCOMMIT;
+--------------+
| @@AUTOCOMMIT |
+--------------+
| 1 |
+--------------+
· AUTOCOMMIT = {0 | 1}
設置autocommit模式。如果設置為1,則所有對表的更改會立刻生效。如果設置為0,則您必須使用COMMIT來接受一個事務,或使用ROLLBACK來取消它。如果您把AUTOCOMMIT模式從0改為1,則MySQL會對開放事務執行一個自動COMMIT。開始一個事務的另一種方法是使用一個START TRANSACTION或BEGIN語句。請參見13.4.1節,“START TRANSACTION, COMMIT和ROLLBACK語法”。
· BIG_TABLES = {0 | 1}
如果設置為1,所有的臨時表被存儲在磁盤中,而不是存儲在儲存期中。這樣會稍微慢些,但是對于需要一個大型臨時表的SELECT操作,不會發生The table tbl_name is full錯誤。對于一個新連接,默認值為0(使用存儲器內部臨時表)。通常,您不必設置此變量,因為根據需要,存儲器內部表會被自動轉換為以磁盤為基礎的表。( 注釋:本變量以前被命名為SQL_BIG_TABLES。)
· CHARACTER SET {charset_name | DEFAULT}
本語句使用給定的映射為所有來自客戶端和指向客戶端的字符串建立映射。您可以通過在MySQL源分布中編輯sql/convert.cc來添加新的映射。SET CHARACTER SET用于設定三個會話系統變量:character_set_client和character_set_results被設置為給定的字符集,character_set_connection被設置為character_set_database值。
可以通過使用DEFAULT值恢復默認的映射。
注意,SET CHARACTER SET的語法與設置其它選項的語法不同。
· FOREIGN_KEY_CHECKS = {0 | 1}
如果設置為1(默認情況),則檢查InnoDB表的外鍵限制條件。如果設置為0,則限制條件被忽略。如果重新載入InnoDB表時按照的順序與上級/下級目錄所要求的順序不同,此時禁用外鍵檢查是有用的。請參見15.2.6.4節,“FOREIGN KEY約束”。
· IDENTITY = value
該變量是LAST_INSERT_ID變量的同義詞。該變量的作用是保持與其它數據庫兼容。您可以使用SELECT @@IDENTITY讀取其值,并可以使用SET IDENTITY設置它。
· INSERT_ID = value
用于設置將被以下INSERT或ALTER TABLE語句使用的值。此值在插入一個AUTO_INCREMENT值時使用。本語句主要和二進制日志同時使用。
· LAST_INSERT_ID = value
用于設定將從LAST_INSERT_ID()被返回的值。當您在用于更新表的語句中使用LAST_INSERT_ID()時,它被存儲在二進制日志中。設置此變量不會更新由mysql_insert_id() C API函數返回的值。
· NAMES {'charset_name' | DEFAULT}
SET NAMES用于把三個會話系統變量character_set_client, character_set_connection和character_set_results設置為給定的字符集。把character_set_connection設置為charset_name時,同時把collation_connection設置為charset_name的默認整序。
使用一個DEFAULT值可以恢復默認的映射。
注意,SET NAMES的語法與用于設置其它選項的語法不同。
· ONE_SHOT
這不是一個服務器系統變量,但是它可以被用來影響用于設置字符集、整序和時區的變量的效果。ONE_SHOT主要被用于復制:mysqlbinlog使用SET ONE_SHOT來暫時地修改字符集、整序和時區變量的值,以反映出它們原先的值。
您不能在使用ONE_SHOT時使用除允許的變量以外的變量;如果您這么做,您會得到如下錯誤:
mysql> SET ONE_SHOT max_allowed_packet = 1;
ERROR 1382 (HY000): The 'SET ONE_SHOT' syntax is reserved for purposes internal to the MySQL server
如果同時使用ONE_SHOT和被允許的變量,則會根據要求更改變量,但是會在下一個語句后,重新設置所有的字符集、整序和與時區有關的服務器系統變量。唯一的例外是,當下一個語句是SET語句時,不會進行重新設置。換句話說,在下一個非SET語句之后,才會進行重新設置。例如:
mysql> SET ONE_SHOT character_set_connection = latin5;
mysql> SET ONE_SHOT collation_connection = latin5_turkish_ci;
mysql> SHOW VARIABLES LIKE '%_connection';
+--------------------------+-------------------+
| Variable_name | Value |
+--------------------------+-------------------+
| character_set_connection | latin5 |
| collation_connection | latin5_turkish_ci |
+--------------------------+-------------------+
mysql> SHOW VARIABLES LIKE '%_connection';
+--------------------------+-------------------+
| Variable_name | Value |
+--------------------------+-------------------+
| character_set_connection | latin1 |
| collation_connection | latin1_swedish_ci |
+--------------------------+-------------------+
· SQL_NOTES = {0 | 1}
當設置為1時(默認情況),“注意”一級的警報被記錄下來。當設置為0時,“注意”警告被壓制。Mysqldump包含輸出,用于把此變量設置為0,這樣,對于不會影響重新載入操作整體性的事件,重新載入轉儲文件時不會產生警告。
· SQL_AUTO_IS_NULL = {0 | 1}
如果設置為1(默認情況),您可以通過使用以下結構查找包含一個AUTO_INCREMENT列的表的最后插入的行:
WHERE auto_increment_column IS NULL
此性質被有些ODBC程序,比如Access使用。
· SQL_BIG_SELECTS = {0 | 1}
如果設定為0,則MySQL會放棄有可能會花很長時間來執行的SELECT語句(也就是,對于這些語句,優化程序估算被檢查的行的數目超過了max_join_size的值)。當一個不妥當的WHERE語句被發布后,本語句有用。一個新連接的默認值為1,這可以允許所有的SELECT語句。
如果您把max_join_size系統變量設置為除DEFAULT以外的值,則SQL_BIG_SELECTS被設置為0。
· SQL_BUFFER_RESULT = {0 | 1}
SQL_BUFFER_RESULT會迫使來自SELECT語句的結果被放入臨時表中。這可以幫助MySQL早點解除表鎖定。當需要花較長時間把結果發送給客戶端時,這是有好處的。
· SQL_LOG_BIN = {0 | 1}
如果設置為0,則客戶端的二進制日志中不會記錄日志。客戶端必須擁有SUPER權限來設置此選項。
· SQL_LOG_OFF = {0 | 1}
如果設置為1,則此客戶端的總查詢日志中不會記錄日志。客戶端必須擁有SUPER權限來設置此選項。
· SQL_LOG_UPDATE = {0 | 1}
不贊成使用本變量。本變量被映射到SQL_LOG_BIN。
· SQL_QUOTE_SHOW_CREATE = {0 | 1}
如果設置為1,則SHOW CREATE TABLE會對表和列的名稱加引號。如果設置為0,則加引號操作被禁用。默認情況下,本選項被啟用,因此對于含有需要加引號的名稱的表,復制操作起作用。請參見13.5.4.5節,“SHOW CREATE TABLE語法”。
· SQL_SAFE_UPDATES = {0 | 1}
如果設置為1,則MySQL會放棄在WHERE子句或LIMIT子句中不使用關鍵字的UPDATE或DELETE語句。這樣,當關鍵字使用不正確時,也有可能理解UPDATE或DELETE語句。這樣就可以更改或刪除大量的行。
· SQL_SELECT_LIMIT = {value | DEFAULT}
從SELECT語句返回的記錄的最大數目。對于一個新連接,默認值是“unlimited”。如果您更改了限值,可以使用SQL_SELECT_LIMIT DEFAULT值恢復默認值。
如果SELECT有一個LIMIT子句,則LIMIT優先于SQL_SELECT_LIMIT值。
SQL_SELECT_LIMT不適用于在被存儲的子程序中執行的SELECT語句。它也不適用于不會產生將被返回到客戶端的結果集合的SELECT語句。這些包括子查詢中的SELECT語句,CREATE TABLE...SELECT和INSERT INTO...SELECT。
· SQL_WARNINGS = {0 | 1}
本變量用于控制當出現警告時,單行INSERT語句是否產生一個信息字符串。默認值為0。把值設置為1,來產生一個信息字符串。
· TIMESTAMP = {timestamp_value | DEFAULT}
用于為此客戶端設置時間。當您使用二進制日志來恢復行時,本語句用于得到原始的時間標記。timestamp_value應為一個Unix時間標記,而不是MySQL時間標記。
· UNIQUE_CHECKS = {0 | 1}
如果設置為1(默認情況),則會對InnoDB表中的二級索引執行唯一性檢查。如果設置為0,則對于被插入到InnoDB的插入緩沖器中的索引登錄項,不執行唯一性檢查。如果您可以肯定您的數據不違反唯一性要求,則您可以把此值設定為0,以加快向InnoDB導入大型表的速度。