在服务器启动时,会将每一个全局变量初始化为其默认值(能够经过命令行或选项文件中指定的选项更改这些默认值)。而后服务器还为每一个链接的客户端维护一组会话变量,客户端的会话变量在链接时使用相应全局变量的当前值初始化。服务器
举一个例子,在服务器启动时会初始化一个名为default_storage_engine,做用范围为GLOBAL的系统变量。以后每当有一个客户端链接到该服务器时,服务器都会单独为该客户端分配一个名为default_storage_engine,做用范围为SESSION的系统变量,该做用范围为SESSION的系统变量值按照当前做用范围为GLOBAL的同名系统变量值进行初始化。命令行
很显然,经过启动选项设置的系统变量的做用范围都是GLOBAL的,也就是对全部客户端都有效的,由于在系统启动的时候尚未客户端程序链接进来呢。了解了系统变量的GLOBAL和SESSION做用范围以后,咱们再看一下在服务器程序运行期间经过客户端程序设置系统变量的语法:code
SET [GLOBAL|SESSION] 系统变量名 = 值;
或者写成这样也行:变量
SET [@@(GLOBAL|SESSION).]var_name = XXX;
好比咱们想在服务器运行过程当中把做用范围为GLOBAL的系统变量default_storage_engine的值修改成MyISAM,也就是想让以后新链接到服务器的客户端都用MyISAM做为默认的存储引擎,那咱们能够选择下边两条语句中的任意一条来进行设置:语法
语句一:SET GLOBAL default_storage_engine = MyISAM; 语句二:SET @@GLOBAL.default_storage_engine = MyISAM;
若是只想对本客户端生效,也能够选择下边三条语句中的任意一条来进行设置:程序
语句一:SET SESSION default_storage_engine = MyISAM; 语句二:SET @@SESSION.default_storage_engine = MyISAM; 语句三:SET default_storage_engine = MyISAM;
从上边的语句三也能够看出,若是在设置系统变量的语句中省略了做用范围,默认的做用范围就是SESSION。也就是说SET 系统变量名 = 值和SET SESSION 系统变量名 = 值是等价的。客户端
查看不一样做用范围的系统变量
既然系统变量有做用范围之分,那咱们的SHOW VARIABLES语句查看的是什么做用范围的系统变量呢?文件
答:默认查看的是SESSION做用范围的系统变量。
固然咱们也能够在查看系统变量的语句上加上要查看哪一个做用范围的系统变量,就像这样:co
SHOW [GLOBAL|SESSION] VARIABLES [LIKE 匹配的模式];