变量分配的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
了设置变量的语法。他们使用=
赋值运算符,但是:=
为此目的也允许使用赋值运算符。
- 用户定义的变量分配
- 参数和局部变量分配
- 系统变量分配
- SET错误处理
- 多变量分配
- 表达式中的系统变量引用
用户定义的变量分配
用户定义的变量在会话中本地创建,并且仅在该会话的上下文中存在;请参见“用户定义的变量”。
用户定义的变量写为,并为其分配一个表达式值,如下所示:@var_name
SET @var_name = expr;
例子:
SET @name = 43;SET @total_tax = (SELECT SUM(tax)FROM taxable_transactions);
如这些语句所示,expr
范围可以从简单(文字值)到更复杂(标量子查询返回的值)。
性能架构user_variables_by_thread
表包含有关用户定义的变量的信息。请参见“性能模式用户定义的变量表”。
参数和局部变量分配
SET
适用于在定义它们的存储对象的上下文中的参数和局部变量。以下过程使用increment
过程参数和counter
局部变量:
CREATE PROCEDURE p(increment INT)BEGIN DECLARE counter INTDEFAULT 0;WHILE counter < 10DO -- ... do work ...SET counter = counter + increment;END WHILE ;END ;
系统变量分配
MySQL服务器维护配置其操作的系统变量。系统变量可以具有影响整个服务器操作的全局值,影响当前会话的会话值或两者。许多系统变量是动态的,可以在运行时使用该SET
语句更改以影响当前服务器实例的操作。SET
也可以用于将某些系统变量持久保存到mysqld-auto.cnf
数据目录中的文件中,以影响后续启动时服务器的操作。
如果更改会话系统变量,则该值将在会话内保持有效,直到将变量更改为其他值或会话结束为止。该更改对其他会话没有影响。
如果更改全局系统变量,则该值将被记住并用于初始化新会话的会话值,直到将变量更改为其他值或服务器退出。该更改对访问全局值的所有客户端可见。但是,更改仅影响更改后连接的客户端的相应会话值。全局变量更改不会影响任何当前客户端会话的会话值(甚至不会发生发生全局值更改的会话)。
要使全局系统变量设置永久生效,以便将其应用于服务器重启,可以将其持久保存到mysqld-auto.cnf
数据目录中的文件中。也可以通过手动修改my.cnf
选项文件来进行持久性配置更改,但这比较麻烦,并且直到很久以后才可能发现手动输入设置中的错误。SET
保留系统变量的语句更加方便,并且避免了格式错误的可能性,因为带有语法错误的设置不会成功,并且不会更改服务器配置。有关持久化系统变量和mysqld-auto.cnf
文件的更多信息,请参见“持久性系统变量”。
注意设置或保留全局系统变量值始终需要特殊特权。设置会话系统变量值通常不需要特殊特权,并且任何用户都可以完成,尽管有例外。有关更多信息,请参见“系统变量特权”。
以下讨论描述了用于设置和保留系统变量的语法选项:
要将值分配给全局系统变量,请在变量名称前加上
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默认值,或者将会话系统变量设置为当前对应的全局值,请将变量设置为value 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
。
某些系统变量无法持久保存或受到持久限制。请参见“非持久性和持久性限制的系统变量”。
如果在SET
执行语句时安装了插件,则可以持久化由插件实现的系统变量。如果仍然安装了插件,则持久化插件变量的分配将在后续服务器重新启动时生效。如果不再安装插件,则服务器读取mysqld-auto.cnf
文件时插件变量将不存在。在这种情况下,服务器将警告写入错误日志并继续:
currently unknown variable 'var_name' was read from the persisted config file
要显示系统变量名称和值:
- 使用
SHOW VARIABLES
语句;请参见“ SHOW VARIABLES语句”。 - 几个性能模式表提供了系统变量信息。请参见“性能架构系统变量表”。
- “性能模式”
variables_info
表包含的信息显示了最近和何时由哪个用户设置每个系统变量。请参见“性能模式variables_info表”。 - Performance Schema
persisted_variables
表提供了该mysqld-auto.cnf
文件的SQL接口,从而可以在运行时使用SELECT
语句检查其内容。请参见“性能模式persisted_variables表”。
SET错误处理
如果语句中的任何变量分配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;
表达式中的系统变量引用
要在表达式中引用系统变量的值,请使用@@
-modifier之一(表达式中不允许的@@PERSIST.
和除外@@PERSIST_ONLY.
)。例如,您可以在如下SELECT
语句中检索系统变量值:
SELECT @@GLOBAL.sql_mode, @@SESSION.sql_mode, @@sql_mode;
注意在表达式中对系统变量的引用as (使用而不是 or或)将返回会话值(如果存在),否则返回全局值。这与始终引用会话值不同。
@@var_name
@@
@@GLOBAL.
@@SESSION.
SET @@var_name= expr