看了mysql8.0官网,发现set sql_mode原来有可以不用修改my.cnf或mysqld-auto.cnf就可以持久化系统变量的方式

本文介绍了MySQL8.0中set语法的使用,特别是如何通过PERSIST关键字将全局变量值写入my.cnf,区分全局变量和会话变量的设置,以及它们在新会话和已存在会话中的行为差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

概述

@@GLOBAL.sql_mode: 全局级别的设置,影响所有新的客户端连接。通常需要具有高级权限才能修改,且修改后对尚未建立连接的新会话生效,对当前已存在的会话无效。MySQL服务器重启后,如果没有在配置文件中永久设定,全局设置将恢复到服务器启动时的默认值或配置文件中的设定。

@@SESSION.sql_mode: 会话级别的设置,只影响当前已建立的会话。可以在会话内随时修改,仅对该会话内的查询有效。即使服务器全局设置改变,已存在的会话仍保持其自身的sql_mode设置,直到会话结束或手动更改。

在MySQL 8.0.36中,如果同时设置了@@GLOBAL.sql_mode、@@SESSION.sql_mode:
对于新建立的会话,其sql_mode初始值将继承自服务器的全局设置@@GLOBAL.sql_mode。
对于已存在的会话,其sql_mode由会话自身的@@SESSION.sql_mode决定,不受全局设置更改的影响,直至会话结束或在会话内主动更改。

mysql set语法官网

https://dev.mysql.com/doc/refman/8.0/en/set-variable.html

在set 中使用persist关键字持久化系统变量【直接上代码】

-- 先查询一下当前的sql_mode
select @@GLOBAL.sql_mode;
-- 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
-- 要将全局变量值写入my.cnf或mysqld-auto.cnf 使用persist关键字【官网原文描述】
-- 执行下面两行代码
set persist sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
set @@SESSION.sql_mode=@@GLOBAL.sql_mode;
-- set @@LOCAL.sql_mode=@@GLOBAL.sql_mode;

mysql 使用set 设置变量的其它用法【以下内容来源mysql8.0官网】

变量赋值的 SET 语法
SET variable = expr [, variable = expr] ...

variable: {
    user_var_name
  | param_name
  | local_var_name
  | {
  GLOBAL | @@GLOBAL.} system_var_name
  | {PERSIST | @@PERSIST.} system_var_name
  | {PERSIST_ONLY | @@PERSIST_ONLY.} system_var_name
  | [SESSION | @@SESSION. | @@] system_var_name
}

SET 变量赋值语法使您能够为影响服务器或客户端操作的不同类型的变量赋值:

分配变量值的语句SET 不会写入二进制日志,因此在复制场景中,它仅影响执行该语句的主机。要影响所有复制主机,请在每个主机上执行该语句。

以下部分描述了 SET 设置变量的语法。它们使用 = 赋值运算符,但 := 赋值运算符也可以用于此目的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值