10bet网址
MySQL 8.0参考手册
相关文件10bet官方网站 下载本手册 本手册摘录

13.7.6.1变量赋值的SET语法

变量=expr.[,变量=expr.] ......变量:{user_var_name|param_name.|local_var_name.| {global | @@global .}system_var_name.|{持续存在@@坚持。}system_var_name.| {persist_only | @@persist_only .}system_var_name.|[会议|@@会议。|@@]system_var_name.}

变量赋值语法允许您为影响服务器或客户端操作的不同类型的变量赋值:

一种赋值变量的语句不会写入二进制日志,因此在复制场景中,它只影响执行它的主机。要影响所有复制主机,请在每个主机上执行该语句。

以下部分将描述设置变量的语法。他们使用了=作业运营商,但是:=赋值操作符也允许用于此目的。

用户定义的变量分配

用户定义变量是在一个会话中本地创建的,并且只存在于该会话的上下文中;看第9.4节,“用户自定义变量”

用户定义的变量写成@var_name.和被赋值表达式如下:

设置@var_name.=expr.;

例子:

设置@name = 43;设置@total_tax =(从Catabable_Transactions中选择Sum(税));

正如这些陈述所证明的,expr.范围可以从简单的(文字值)到更复杂的(标量子查询返回的值)。

性能模式user_variables_by_thread.表包含有关用户定义变量的信息。看第27.12.10节“性能架构用户定义的变量表”

参数和局部变量分配

应用于定义它们的存储对象上下文中的参数和局部变量。下面的过程使用增量过程参数和柜台局部变量:

CREATE PROCEDURE p(increment INT) BEGIN DECLARE counter INT DEFAULT 0;WHILE counter < 10 DO—…做的工作……SET counter = counter + increment;结束时;结束;
系统变量分配

MySQL Server维护配置其操作的系统变量。系统变量可以具有影响整个服务器操作的全局值,这是影响当前会话的会话值,或两者。许多系统变量是动态的,可以使用运行时更改语句以影响当前服务器实例的操作。也可以用来持续到某些系统变量mysqld-auto.cnf文件在数据目录中,以影响后续启动的服务器操作。

如果您更改一个会话系统变量,该值在您的会话中仍然有效,直到您将该变量更改为另一个值或会话结束。此更改对其他会话没有影响。

如果您更改了一个全局系统变量,该值将被记住并用于初始化新会话的会话值,直到您将该变量更改为另一个值或服务器退出。任何访问全局值的客户端都可以看到该更改。但是,此更改只会影响在此更改后连接的客户端对应的会话值。全局变量的变化不会影响任何当前客户端会话的会话值(甚至不会影响发生全局值变化的会话)。

要使全局系统变量设置永久,以便它在服务器重启时应用,可以将其持久化到mysqld-auto.cnf文件在数据目录中。通过手动修改a,还可以使持久性配置更改my.cnf选项文件,但这更繁琐,并且可能无法在稍后发现手动输入的设置中的错误。保存系统变量的语句更方便,也避免了出现错误设置的可能性,因为带有语法错误的设置不会成功,也不会更改服务器配置。有关持久化系统变量和mysqld-auto.cnf文件,参见第5.1.9.3节,“持久的系统变量”

笔记

设置或持久化全局系统变量值始终需要特殊权限。设置会话系统变量值通常不需要特殊权限,并且可以由任何用户完成,尽管存在异常。有关更多信息,请参阅第5.1.9.1节,“系统变量权限”

以下讨论描述了用于设置和持久系统变量的语法选项:

  • 要给全局系统变量赋值,请在变量名前面加上全球关键字或@@GLOBAL。限定符:

    max_connections = 1000;设置@@GLOBAL。max_connections = 1000;
  • 要给会话系统变量赋值,请在变量名前面加上会话或者当地的关键字,@@会议。@@LOCAL。,或@@限定符,或否无关键字或根本没有修饰符:

    SET SESSION sql_mode = '传统';SET LOCAL sql_mode = '传统';设置@@SESSION。sql_mode =“传统”;设置@@LOCAL。sql_mode =“传统”;SET @@sql_mode = '传统';SET sql_mode = '传统';

    客户端可以更改自己的会话变量,但不能更改任何其他客户端的会话变量。

  • 持续到一个全球系统变量mysqld-auto.cnf选项文件中,变量名前面加上坚持关键字或@@坚持。限定符:

    设置persist max_connections = 1000;设置@@ persist.max_connections = 1000;

    语法使您能够在运行时进行配置更改,这些更改也会在服务器重启时保持不变。就像集全球设定坚持设置全局变量运行时值,但也将变量设置写入mysqld-auto.cnf文件(如果有变量设置,则替换任何现有的变量设置)。

  • 持续到一个全球系统变量mysqld-auto.cnf在未设置全局变量运行时值的情况下,在变量名前面加上PERSIST_ONLY关键字或@@ persist_only。限定符:

    SET PERSIST_ONLY back_log = 100;设置@@PERSIST_ONLY。back_log = 100;

    就像坚持PERSIST_ONLY将变量设置写入mysqld-auto.cnf.但是,不像坚持PERSIST_ONLY不修改全局变量运行时值。这使得PERSIST_ONLY适用于配置只能在服务器启动时设置的只读系统变量。

要将全局系统变量值设置为编译的MySQL默认值或会话系统变量到当前相应的全局值,请将变量设置为值默认.例如,下面两条语句设置的会话值相同max_join_size.到当前的全球价值:

set @@ session.max_join_size =默认值;set @@ session.max_join_size = @@ global.max_join_size;

使用将全局系统变量持续到值默认或将变量赋给它的默认值,并为该变量添加一个设置mysqld-auto.cnf.要从文件中删除变量,请使用重置持续存在

某些系统变量不能持续或持续限制。看第5.1.9.4节“非批准和持续限制的系统变量”

如果安装插件时,可以持久地持续由插件实现的系统变量执行声明。如果仍安装插件,则持久插件变量的分配会对后续服务器重新启动。如果不再安装插件,则服务器读取时,插件变量不再存在mysqld-auto.cnf文件。在这种情况下,服务器将警告写入错误日志并继续:

目前未知的变量'var_name.'从持久化配置文件中读取

要显示系统变量名称和值:

设置错误处理

如果有任何可变分配语句失败,整个语句失败,没有变量被更改,也不是mysqld-auto.cnf文件已更改。

在这里描述的情况下产生错误。大多数例子显示使用关键字语法的语句(例如,全球或者会话),但这些原则也适用于使用相应修饰符的语句(例如,@@GLOBAL。或者@@会议。)。

  • 用于(任意变量)设置一个只读变量:

    MySQL> Set Global Version ='ABC';错误1238(hy000):变量'版本'是只读变量
  • 用于全球坚持,或PERSIST_ONLY要设置一个只有会话值的变量:

    MySQL>设置全局SQL_LOG_BIN = ON;错误1228(hy000):变量'sql_log_bin'是一个会话变量,不能与set global一起使用
  • 用于会话要设置一个只有全局值的变量:

    mysql> set session max_connections = 1000;错误1229(hy000):变量'max_connections'是一个全局变量,应该设置设置全局
  • 遗漏的全球坚持,或PERSIST_ONLY要设置一个只有全局值的变量:

    mysql> SET max_connections = 1000;错误1229(hy000):变量'max_connections'是一个全局变量,应该设置设置全局
  • 用于坚持或者PERSIST_ONLY设置无法持久的变量:

    mysql> SET PERSIST port = 3307;ERROR 1238 (HY000):变量'port'是只读变量mysql> SET PERSIST_ONLY port = 3307;ERROR 1238 (HY000):变量'port'是一个非持久只读变量
  • @@GLOBAL。@@坚持。@@ persist_only。@@会议。, 和@@修改器仅适用于系统变量。尝试将它们应用于用户定义的变量,存储过程或函数参数或存储的程序局部变量来进行错误。

  • 不是所有的系统变量都可以设置为默认.在这种情况下,分配默认导致错误。

  • 试图赋值时发生错误默认到用户定义的变量,存储过程或函数参数,或存储的程序本地变量。

多个可变分配

一种语句可以包含多个变量赋值,用逗号分隔。这个语句给用户定义变量和系统变量赋值:

SET @x = 1, SESSION sql_mode = ";

如果在一条语句中设置多个系统变量,则使用最新的全球坚持PERSIST_ONLY,或会话语句中的关键字用于下列没有指定关键字的赋值。

多变量赋值的例子:

SET GLOBAL sort_buffer_size = 1000000, SESSION sort_buffer_size = 1000000;设置@@GLOBAL。sort_buffer_size = 1000000, @@LOCAL。sort_buffer_size = 1000000;max_connections = 1000, sort_buffer_size = 1000000;

@@GLOBAL。@@坚持。@@ persist_only。@@会议。, 和@@修饰符只适用于紧跟其后的系统变量,而不是任何剩余的系统变量。此语句设置sort_buffer_size全局值为50000和会话值到1000000:

set @@ global.sort_buffer_size = 50000,sort_buffer_size = 1000000;
表达式中的系统变量引用

要引用表达式中系统变量的值,请使用其中一个@@- 微小机器(除外)@@坚持。@@ persist_only。,表达中不允许的)。例如,您可以检索一个系统变量值选择声明如下:

选择@@GLOBAL。sql_mode @@SESSION。sql_mode @@sql_mode;
笔记

表达式中的系统变量的引用@@var_name.(与@@而不是@@GLOBAL。或者@@会议。)如果存在并且否则返回全局值,返回会话值。这与之不同放 @@var_name.=expr.,这始终指的会话值。