SQL数据库系统变量分会话级(SESSION)和全局级(GLOBAL):会话级仅对当前连接有效且断开即失,全局级影响所有新连接但不改变已有会话;两者修改互不影响,@@var_name默认引用会话级。

SQL数据库中的系统变量分为会话级(SESSION)和全局级(GLOBAL)两种作用域,直接影响变量的生效范围和生命周期。理解两者的区别,是正确配置数据库行为、排查连接异常或性能问题的关键。
会话级变量:仅对当前连接有效
会话级变量在客户端建立连接时,通常继承自当前全局值,但后续修改只影响该连接本身,其他会话不受影响,连接断开后更改即丢失。
- 设置语法:
SET SESSION var_name = value;或简写为SET var_name = value; - 常见用途:调整单个查询的SQL模式(如
sql_mode)、临时关闭自动提交(autocommit)、设置时区(time_zone)等 - 查看方式:
SELECT @@SESSION.var_name;或SHOW VARIABLES LIKE 'var_name';(当前会话上下文)
全局级变量:影响所有新创建的会话
全局变量控制整个MySQL实例的行为策略,修改后仅对之后新建的连接生效,已存在的会话仍保留其原始会话值,重启服务后若未持久化则恢复默认或配置文件设定值。
- 设置语法:
SET GLOBAL var_name = value;(需SUPER或SYSTEM_VARIABLES_ADMIN权限) - 典型场景:调整最大连接数(
max_connections)、查询缓存开关(query_cache_type,旧版本)、慢查询阈值(long_query_time) - 查看方式:
SELECT @@GLOBAL.var_name;或SHOW GLOBAL VARIABLES LIKE 'var_name';
变量是否可动态修改?要看具体参数
并非所有系统变量都支持运行时修改。有些仅在启动时通过配置文件(如my.cnf)设定,例如innodb_buffer_pool_size在MySQL 5.7+支持动态调整,但innodb_log_file_size仍需重启。
Android采用关系型数据库SQLite3,它是一个支持SQL轻量级的嵌入式数据库,在嵌入式操作系统上有很广泛的应用,WM采用的也是SQLite3 ;关于过于、原理方面的东西在这篇文章里不会提到,但是如果你想能够快速的学会操作SQLite3,那这就是你要找的文章! 感兴趣的朋友可以过来看看
- 检查是否可动态修改:查
information_schema.GLOBAL_VARIABLES或官方文档中“Dynamic”列 - 误设不可动态变量会报错:
ERROR 1238 (HY000): Variable 'xxx' is a read only variable - 部分变量需配合
PERSIST(MySQL 8.0+)写入mysqld-auto.cnf实现跨重启持久化
优先级关系:会话值 > 全局值 > 编译默认值
每个会话启动时,会话变量从全局值拷贝初始化;此后会话内修改不改变全局值,全局修改也不覆盖已有会话的值。这种设计保障了连接隔离性。
- 举例:全局
sort_buffer_size=256K,某应用连接执行SET sort_buffer_size=4M;,仅该连接排序操作受益,其他连接仍用256K - 注意:
@@var_name默认引用会话级,显式写@@GLOBAL.var_name或@@SESSION.var_name可明确指定 - 某些变量(如
character_set_client)还涉及连接握手阶段协商,实际值可能受客户端驱动影响
不复杂但容易忽略:改完全局变量记得确认是否对新连接生效,而不是直接在当前会话里查@@var_name——那显示的仍是会话值。









