mysql8在linux下的默认规则修改

文章目录

背景

公司老项目有手写sql中出现了表名大写,但是在项目更新到云端后出现了报错问题。另外,group by也出现了sql异常。

问题1 group by问题

MySQL 8 中的 sql_mode 设置:提升数据库安全性与性能

什么是sql_mode?

sql_mode 他是是 M y S Q L 中的一个系统变量,用来定义 SQL 语句的一个执行方式。通过配置 sql_mode,我们可以启用或者禁用一些特性,从而控制错误处理、数据验证等的行为。不同的 sql_mode 选项组合可以帮助我们来提高数据库的安全性、适应不同的应用场景需求,并确保数据的准确性。

查看当前的sql_mode

在我们开始修改 sql_mode 之前,首先要先查看当前的设置是个很有必要的。你可以通过以下 SQL 查询来获取当前的 sql_mode:

复制代码
SELECT @@sql_mode;

修改方法

临时修改

如果我们仅仅是想在当前会话中临时更改 sql_mode,可以使用 SET SESSION 语句:

复制代码
SET SESSION sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

全局修改

如果我们想在所有会话中永久更改 sql_mode,可以使用 SET GLOBAL 语句:

复制代码
SET GLOBAL sql_mode = 'STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

配置文件修改

为了在我们 MySQL 启动的时自动设置 sql_mode,还可以在 MySQL 的配置文件(如 my.cnf 或 my.ini)中添加以下内容:保存之后重启mysql服务

复制代码
[mysqld]
sql_mode='STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'

常用的 sql_mode类型

  • ONLY_FULL_GROUP_BY:在使用 GROUP BY 的时后,要求所有非聚合列必须出现在 GROUP BY 中,有助于避免模糊查询结果。
  • STRICT_TRANS_TABLES:对于 INSERT/UPDATE 操作中的错误,抛出错误而不是警告,确保数据的完整性。
  • NO_ZERO_IN_DATE:不允许日期中有零值的出现,例如 '2023-00-05' 是无效的。
  • NO_ZERO_DATE:不允许日期为零,例如 '0000-00-00' 是无效的。
  • ANSI_QUOTES:将双引号视为标识符的界定符,而不是字符串的界定符。
  • ERROR_FOR_DIVISION_BY_ZERO:在除以零的情况下抛出错误,而不是返回 NULL。
  • NO_ENGINE_SUBSTITUTION:禁止在请求的存储引擎不可用时,使用其他存储引擎。

小结

通过合理的配置 sql_mode,我们可以提升 MySQL 数据库的性能和安全性。选择合适的模式才可以帮助我们避免常见的错误和数据问题,确保应用程序的稳定性。在进行任何的更改之前,建议先了解各个选项的含义,并根据实际业务需求进行必要的配置。

大小写敏感问题引发的错误

MySQL8 报错 Different lower_case_table_names settings for server ('1') and data dictionary ('0').

这个问题是因为大小写敏感,我们修改了配置文件中增加lower_case_table_names =1,调整为不敏感,导致了错误。

解决步骤

停止服务

复制代码
systemctl stop mysql
或者
sudo systemctl stop mysql

删除原有数据目录(注意:会删除所有数据库)

复制代码
sudo rm -rf /var/lib/mysql
sudo mkdir -p /var/lib/mysql
sudo chown mysql:mysql /var/lib/mysql
或者
rm -rf /var/lib/mysql
mkdir -p /var/lib/mysql
chown mysql:mysql /var/lib/mysql

使用指定的参数重新初始化数据库

复制代码
mysqld --initialize --lower-case-table-names=1 --user=mysql
或者
sudo mysqld --initialize --lower-case-table-names=1 --user=mysql

注意:

这将初始化一个新的库

  • 初始化一个新的数据库,配置大小写不敏感。
  • 初始化完成后会生成临时 root 密码(查看文件 /var/log/mysqld.log,如果有的话)后续自己调整,如果不知道怎么修改密码,可以看我的前一篇文章最后修改密码处。

修改配置文件用来保持一致

编辑 /etc/mysql/mysql.conf.d/mysqld.cnf 或 /etc/my.cnf ,在 [mysqld] 部分添加:

复制代码
[mysqld]
lower_case_table_names=1

作用:

大小写严格要求:必须为 lower_case_table_names(下划线),不能写成 lower-case-table-names,否则无效。

启动 MySQL 服务

复制代码
systemctl start mysql
或者
sudo systemctl start mysql
或者
service mysqld start

可选操作(非必须)

查看日志是否启动成功
复制代码
journalctl -u mysql
或者
sudo journalctl -u mysql
设置 root 密码(首次初始化后)
复制代码
mysql_secure_installation
或者
sudo mysql_secure_installation

验证是否生效

复制代码
SHOW VARIABLES LIKE 'lower_case_table_names';

如下图所示:

补充

含义 平台
0 区分大小写 默认 Linux
1 不区分大小写,所有表名保存为小写 Windows 推荐,跨平台推荐
2 保留创建时大小写,但不区分大小写(仅限 Windows) Windows 特有

觉得有帮助,意犹未尽者,可以点击下方卡片,关注《coder练习生》

相关推荐
武子康2 分钟前
调查研究-138 全球机器人产业深度调研报告【01 篇】:市场规模、竞争格局与商业化成熟 2026
服务器·数据库·ai·chatgpt·机器人·具身智能
zhojiew12 分钟前
在本地PostgreSQL使用pgvector构建生成式 AI 应用的实践
数据库·人工智能·postgresql
_kerneler28 分钟前
[qemu+kvm]: trap 寄存器脱敏优化方法
linux
Yushan Bai28 分钟前
EXADATA X5数据库一体机节点login: failure forking: Cannot allocate memory问题处理
数据库·oracle·vr
KaMeidebaby41 分钟前
卡梅德生物技术快报|噬菌体肽库展示技术构建 Mhp168‑Hsp70 定向随机肽库:流程、质控与数据结果
前端·数据库·其他·百度·新浪微博
猫猫的小茶馆42 分钟前
【Python】函数与模块化编程
linux·开发语言·arm开发·驱动开发·python·stm32
沪漂阿龙1 小时前
MySQL 面试题爆款详解:InnoDB 页机制、B+树索引、Buffer Pool、Redo Log、页分裂与性能优化一次讲透
b树·mysql·性能优化
SelectDB1 小时前
Agent 时代,为什么传统的可观测方案不适用了?
大数据·数据库·数据分析
神奇椰子2 小时前
[特殊字符] 服务器搭建网站完整教程
运维·服务器
snowfoootball2 小时前
解决低版本navicat连接PostgreSQl的不兼容报错问题
数据库·postgresql