MySQL5.6官方文档对MySQL的系统变量的设置与查看的相关解释如下:

If no modifier is present, SET changes the session variable. If the session variable does not exist, an error occurs even if the corresponding global variable exists.


With the GLOBAL modifier, SHOW VARIABLES displays the values that are used for new connections to
MySQL. In MySQL 5.6, if a variable has no global value, no value is displayed. With SESSION, SHOW
VARIABLES displays the values that are in effect for the current connection. If no modifier is present, the default is SESSION. LOCAL is a synonym for SESSION.

 

When you refer to a system variable in an expression as @@var_name (that is, when you do not
specify @@global. or @@session.), MySQL returns the session value if it exists and the global value otherwise. (This differs from SET @@var_name = value, which always refers to the session value.)


看起来好像也能看懂一些,但是不做实验永远不会彻底明白是什么意思。不弄明白心里就不舒服,所以下面做了实验来加深一下理解。


首先我们选择三个系统变量:


序号变量名称变量范围静态/动态说明默认值
1autocommitglobal, session动态是否自动提交ON
2server_id
global动态The server ID, used in replication to give each master and slave a unique identity.0
3last_insert_idsession动态

The value to be returned from LAST_INSERT_ID(). This is stored in the binary log when you use

LAST_INSERT_ID() in a statement that updates a table.

0



为毛选这三个变量?因为变量范围都不相同。先熟悉一下MySQL设置和查看动态变量的语法。

  • 设置变量

    (1)set var_name=var_value;或者set @@var_name=var_value;

     如果这个变量只是session变量,那么该命令将设置当前session变量。

     如果这个变量既是session变量也是global变量,那么该命令只修改当前session变量。

     如果这个变量只是global变量,那么该命令将失败,命令将会报错并提示错误。

     也就是说set var_name=var_value;或者set @@var_name=var_value;只能设置session变量,当你设置global变量必须使用global关键字。原因是MySQL在防止你在修改session变量时误改了global变量,误修改global变量可能会导致很严重的问题。

    (2)set session var_name=var_value;或者set @@session.var_name=var_value;

     如果这个变量只是session变量,那么该命令将设置当前session变量。

     如果这个变量既是session变量也是global变量,那么该命令只修改当前session变量。

     如果这个变量只是global变量,那么该命令将失败并提示该变量是global变量。

     也就是说set session var_name=var_value;或者set @@session.var_name=var_value;只能设置session变量。

    (3)set global var_name=var_value;或者set @@global.var_name=var_value;

     如果这个变量只是session变量,那么该命令将失败并提示该变量是session变量。

     如果这个变量既是session变量也是global变量,那么该命令只修改global变量。修改global变量后,所有新连接会话的session变量将使用这个global变量的值。而已经存在的会话仍然使用它们自己的session变量。

     如果这个变量只是global变量,那么该命令将修改global变量。

     也就是说set global var_name=var_value;或者set @@global.var_name=var_value;只能设置global变量。

  • 查看变量

    (1)show variables like 'var_name';或者select @@var_name;

     如果这个变量只是session变量,那么该命令查看的是当前session变量。

     如果这个变量既是session变量也是global变量,那么该命令查看的是当前session变量。

     如果这个变量只是global变量,那么该命令查看的是global变量。

     也就是说该命令在有session变量时查看的是session变量,否则查看global变量。

    (2)show session variables like 'var_name';或者select @@session.var_name;

     如果这个变量只是session变量,那么该命令查看的是当前session变量。

     如果这个变量既是session变量也是global变量,那么该命令查看的是当前session变量。

     如果这个变量只是global变量,那么该命令将失败并提示该变量是session变量。

     也就是说该命令只能查看session变量的值,和global变量没有任何关系。

    (3)show global variables like 'var_name';或者select @@global.var_name;

     如果这个变量只是session变量,那么该命令将失败并提示该变量是global变量。

     如果这个变量既是session变量也是global变量,那么该命令查看的是当前session变量。

     如果这个变量只是global变量,那么该命令查看的是global变量。

     也就是说该命令只能查看global变量的值,和session变量没有任何关系。新的会话的session变量将会使用show global查询出的global变量的值,和已经存在的会话的session变量没有任何关系。


下面做实验:


实验一(针对变量autocommit):


1.首先