13.5.3. SET语法

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@@localSESSION@@session地同义词。如果没有修改符,则SET设置会话变量。

支持系统变量的@@var_name语法,以便使MySQL语法与其它数据库系统相兼容。

如果您在同一个语句中设置多个系统变量,则最后一个GLOBALSESSION选项被用于没有指定模式的变量。

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 SETSET NAMES)。例如:

mysql> SELECT @@AUTOCOMMIT;
+--------------+
| @@AUTOCOMMIT |
+--------------+
|            1 |
+--------------+

·         AUTOCOMMIT = {0 | 1}

设置autocommit模式。如果设置为1,则所有对表的更改会立刻生效。如果设置为0,则您必须使用COMMIT来接受一个事务,或使用ROLLBACK来取消它。如果您把AUTOCOMMIT模式从0改为1,则MySQL会对开放事务执行一个自动COMMIT。开始一个事务的另一种方法是使用一个START TRANSACTIONBEGIN语句。请参见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_clientcharacter_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

用于设置将被以下INSERTALTER 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_connectioncharacter_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子句中不使用关键字的UPDATEDELETE语句。这样,当关键字使用不正确时,也有可能理解UPDATEDELETE语句。这样就可以更改或删除大量的行。

·         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...SELECTINSERT 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导入大型表的速度。

关注编程学问公众号