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

MySQL8.0中set语法:持久化系统变量与会话级别设置,

概述

@@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 设置变量的语法。它们使用 = 赋值运算符,但 := 赋值运算符也可以用于此目的。

### 关于 MySQL 8 中 'NO_AUTO_CREATE_USER' 警告的解决方案 在 MySQL 8.0 版本中,`NO_AUTO_CREATE_USER` 已被移除并替换为更严格的密码验证机制[^1]。因此,在升级到 MySQL 8 新安装时可能会遇到 `'NO_AUTO_CREATE_USER' sql mode not set` 的警告。 以下是针对该问题的具体说明以及如何解决: #### 移除 `NO_AUTO_CREATE_USER` 的原因 自 MySQL 8.0 开始,为了增强安全性,默认不再支持通过自动创建用户的 SQL 模式来定义用户账户的行为。取而代之的是引入了更强的安全策略和密码校验插件。如果旧版应用依赖此模式,则可能触发上述警告。 #### 解决方案 可以通过以下方法消除此类警告: 1. **确认当前 SQL 模式的配置** 首先查看现有的 SQL 模式设置: ```sql SELECT @@GLOBAL.sql_mode; ``` 2. **更新全局 SQL Mode 设置** 如果发现缺少某些必要的安全选项者存在过期参数(如 `NO_AUTO_CREATE_USER`),可以手动调整 SQL 模式以匹配最新标准。例如: ```sql SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; ``` 这里需要注意的是,新的默认值已经排除了 `NO_AUTO_CREATE_USER`。 3. **修改 my.cnf 文件永久生效** 若要使更改持久化,需编辑 MySQL 配置文件 (`my.cnf`) 并添加如下内容至 `[mysqld]` 部分下: ```ini [mysqld] sql-mode="STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION" ``` 4. **执行数据库升级脚本** 对于从较低版本迁移过来的情况,建议按照官方指南完成就地升级过程。这通常涉及停止服务、运行带有强制标志的服务重启命令等操作[^2]: ```bash mysqladmin -u root -p shutdown mysqld_safe --user=mysql --datadir=/path/to/8.0-datadir --upgrade=FORCE & ``` 5. **测试与验证** 完成以上步骤之后再次查询 SQL_MODE 是否正常工作,并确保应用程序逻辑不受影响。 --- ### 示例代码片段 下面是一个简单的 Python 脚本来演示如何动态获取当前 SQL MODE 并判断是否存在特定关键字: ```python import pymysql connection = pymysql.connect(host='localhost', user='root', password='password') cursor = connection.cursor() cursor.execute("SELECT @@GLOBAL.sql_mode;") result = cursor.fetchone()[0] if 'NO_AUTO_CREATE_USER' in result.split(','): print("'NO_AUTO_CREATE_USER' is still present.") else: print("All good! NO_AUTO_CREATE_USER has been removed.") connection.close() ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值