首页 行业资讯 宠物日常 宠物养护 宠物健康 宠物故事

@@X是一个全局变量吗?

发布网友 发布时间:2022-04-22 16:28

我来回答

6个回答

懂视网 时间:2022-05-03 06:34

全局变量和局部变量

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

举一个例子,在服务器启动时会初始化一个名为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全局变量和局部变量

标签:一个   服务器程序   查看   通过命令   是什么   初始   范围   mysql   会话   

热心网友 时间:2022-05-03 03:42

全局变量 对于程序员来说,是程序 “同步”的一种最方便的 方式,我相信大多数的程序员 刚开始都是使用全局变量来实现“同步”操作的,但是随着我们 编程理念的升华,我们会发现,原来全局变量不是我们想象的只有好用,而没有缺点。

优点:

1)全局可见,任何 一个函数或线程都可以读写全局变量-同步操作简单。

2)内存地址固定,读写效率比较高。

缺点:

1)全局变量存放在静态存储区,系统需要为其分配内存,一直到程序结束, 才会释放内存,这一点就局部变量的动态分配,随用随从栈中申请,用完(函数调用完毕)就释放。

2)影响函数的封装性能:我们肯定是希望我们写的函数具有重入性,就如一个黑盒子一般,只 通过函数参数就能得到返回,内部 实现要,但是如果函数中使用了全局变量,这势必就破坏了函数的封装性,会造成对全局变量的依赖。

3)降低函数的移值性,原因同上。

4)降低代码的可读性,这也意味着系统维护会不方便,因为一个全局变量可能会出现程序中的各个环节,函数的 执行也会根据环境变化而变化,所以调试会不太方便。

5)全局变量的读写,可能会延迟,这主要是体现在“写”操作上,由于写操作,一般需要2个周期操作,所以有可能会出现,这边没写完时,那边已经读了,结果 读到的不是最终值,这个是一个概率事件,概率 很小,但是并不代表没有。

小结:上面的说的缺点,可能有些人会觉得有些矫情,或者概率很小, 这个要分情况讨论的,如果对于一个非常简单的程序来说,代码量少, 功能也少,那全局变量无疑是最适合的同步方式。但是对于代码量大,功能有 多,逻辑又复杂的系统来讲,“稳定”来源于方方面面,其中就需要严谨和方便维护,所以不适用全局变量能够大大的避免出bug, 方便后期维护,这个时候就需要考虑下,尽量少用全局变量,替代全局变量的方式有很多,最简单易用的就是信号量或者消息队列。

热心网友 时间:2022-05-03 05:00

全局变量也就是编程术语中的一种,也称为外部变量,它是在函数外部定义的变量,也可以是在本程序任何地方创建。此外,变量分为局部与全局,局部变量又可被叫做内部的变量。是由某对象或某个函数所创建的变量通常都是局部变量,只能被内部引用。
一般在一对大括号里面声明的变量是不能再这对大括号外引用的,而全局变量先于所有函数声明,所以作用域是整个程序。
如果在某对大括号内有和全局变量同名的变量,则以范围小的变量声明为准。
扩展资料:

全局变量的使用注意事项如下:

1、使用全局变量程序运行时速度更快。

2、对于局部变量的名字空间污染,这个在不使用太多变量时是可以避免的。

3、当全局变量与局部变量重名的时候,起作用的是局部变量。

4、还可以用extern在函数外对全局变量声明,使全局变量的作用域从声明处到文件的结束。

热心网友 时间:2022-05-03 06:34

说明一:

  @var这种形式表示的是用户自定义的变量。

说明二:

  @@var这种形式表示的是系统变量、它又可以分为两种一种是全局(@@global)的一种是会话(@@session)的。

说明三:

  MYSQL中会话级的变量是可以直接用的、是可以事先不定义、就直接用的。

    如:

      select @jianglexing;--看到没有不用定义就直接可以用了。当然啦它会返回一个null值。

既然是全局变量(包括但不限于@@identity)那么返回的是最后一次表自增列插入的值

有时候数据库中我们需要使用存储过程返回当前操作表的ID如果使用@@identity全局变量显然是不合理的因为数据库执行的是并发操作

你不能确定同时在同一个数据库中有其他对表的插入操作且含有自增列,如果这个时候返回很可能出现错误,导致返回的并不是我们当前

操作的表的ID而是最后一次插入的ID,出现非常难以发现的错误,就跟多线程访问同一个全局变量的意思一样,肯可能读到脏数据

热心网友 时间:2022-05-03 08:26

全局变量是相对于局部变量来说的,全局变量可以改变,在程序的任何地方都可以读取和修改,而局部变量只能在语句块内作用,超出作用范围就失效了.

静态变量(static)是相对自动变量(auto)等而言的,一旦声明为静态变量,在编译时刻开始永远存在,不受作用域范围约束,但是如果是局部静态变量,则此静态变量只能在局部作用域内使用,超出范围不能使用,但是它确实还占用内存,还存在.自动变量就是一般的变量,在C语言中auto关键字可以省略.

int d;//全局变量
static int e;//静态全局变量
void func()
{
int c;//局部变量
}
main()
{
static int a;//静态局部变量
int b;//局部变量
}

热心网友 时间:2022-05-03 10:34

说明一:
@var这种形式表示的是用户自定义的变量。
说明二:
@@var这种形式表示的是系统变量、它又可以分为两种一种是全局(@@global)的一种是会话(@@session)的。
说明三:
MYSQL中会话级的变量是可以直接用的、是可以事先不定义、就直接用的。
如:
select @jianglexing;--看到没有不用定义就直接可以用了。当然啦它会返回一个null值。
既然是全局变量(包括但不限于@@identity)那么返回的是最后一次表自增列插入的值
有时候数据库中我们需要使用存储过程返回当前操作表的ID如果使用@@identity全局变量显然是不合理的因为数据库执行的是并发操作
你不能确定同时在同一个数据库中有其他对表的插入操作且含有自增列,如果这个时候返回很可能出现错误,导致返回的并不是我们当前
操作的表的ID而是最后一次插入的ID,出现非常难以发现的错误,就跟多线程访问同一个全局变量的意思一样,肯可能读到脏数据

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com