mysql的全局变量与局部变量介绍

通常在服务器启动时,会将每个全局变量初始化为其默认值(我们可以通过命令行或选项文件中指定的选项更改这些默认值),然后服务器还为每个连接的客户端维护一组会话变量,客户端的会话变量在连接时使用相应全局变量的当前值初始化。

举例说明如下:

在服务器启动时会初始化一个名为default_storage_engine,作用范围为GLOBAL的系统变量,之后每当有一个客户端连接到该服务器时,服务器都会单独为该客户端分配一个名为default_storage_engine,作用范围为SESSION的系统变量,该作用范围为SESSION的系统变量值按照当前作用范围为GLOBAL的同名系统变量值进行初始化。

很显然,通过启动选项设置的系统变量的作用范围都是GLOBAL的,也就是对所有客户端都有效的,因为在系统启动的时候还没有客户端程序连接进来呢。了解了系统变量的GLOBAL和SESSION作用范围之后,我们再看一下在服务器程序运行期间通过客户端程序设置系统变量的语法:

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作用范围的系统变量。

当然我们也可以在查看系统变量的语句上加上要查看哪个作用范围的系统变量,就像这样:

SHOW [GLOBAL|SESSION] VARIABLES [LIKE 匹配的模式];

以上就是详细讲解mysql全局变量与局部变量的详细内容,更多请关注本站其它相关文章!

相关推荐:

如何将全局变量安全重构为局部状态变量

本文介绍在Pandasapply()场景下,如何消除global语句依赖,通过可变容器(如字典)或面向对象方式封装跨行计算所需的状态变量,提升代码可测试性、可重入性与线程安全性。 本文介绍在pandas`apply()`场景下,如何消除`global`语句依赖,通过可变容器(如字典)或面向对象方式封...

如何将全局变量安全重构为局部状态管理

本文介绍两种不依赖global关键字的优雅方案,将跨函数调用需持续维护的状态(如日期标记和已用分钟数)转为局部可控结构:一是使用可变字典传参,二是封装为有状态类,兼顾可读性、可测试性与线程安全性。 本文介绍两种不依赖global关键字的优雅方案,将跨函数调用需持续维护的状态(如日期标记和已用分钟数)...

如何解决Python Flask项目中的变量作用域问题_理解g全局变量

g是Flask为每次请求单独创建的临时命名空间,不跨请求、不跨线程、不持久化;仅在当前请求上下文中有效,需在before_request中初始化、teardown_request中清理。 Flask中的g是什么,它真能跨请求存数据吗? g不是全局变量,也不是进程/线程级共享变量。它是Flask为每个...

如何在 Tkinter 中正确使用全局变量管理图像显示与清除

本文详解Tkinter中全局变量作用域问题,重点解决因未在函数内声明global导致的UnboundLocalError,并提供基于类的OOP改进方案,确保图像动态切换时能正确复用和清除Label组件。 本文详解tkinter中全局变量作用域问题,重点解决因未在函数内声明`global`导致的`un...

如何解决Python测试中的全局变量污染_通过pytest的tmp_path隔离文件系统

tmp_path不能自动清理全局变量,因为它仅隔离文件系统路径,不干预Python命名空间;全局变量(如配置、日志、缓存)若在模块顶层初始化或硬编码绝对路径,会跨测试复用旧值,导致状态污染。 为什么pytest的tmp_path不能自动清理全局变量? 因为tmp_path只管文件系统隔离,不碰Pyt...

Python异步程序中全局变量安全吗_上下文变量ContextVars用法

异步函数中直接读写全局变量会导致协程间上下文污染,引发用户ID错乱、权限校验错误等问题;threading.local在asyncio中失效,因协程共享同一线程;应使用ContextVar配合set/get/reset确保上下文隔离。 异步函数里直接读写全局变量会出什么问题 不安全,而且非常容易踩坑...