docker安装mysql8, 字符集,SQL大小写规范,sql_mode

news2025/7/12 4:55:07

一、Docker安装MySQL

使用Docker安装MySQL,命令如下

docker run -d \
  -p 3306:3306 \
  -v mysql_conf:/etc/mysql/conf.d \
  -v mysql_data:/var/lib/mysql \
  --name mysql \
  --restart=always \
  --privileged \
  -e MYSQL_ROOT_PASSWORD=1234 \
  mysql:8.0.30
  • 参数解释

🐳 docker run -d
• docker run:创建并运行一个新的容器。
• -d:以 后台模式(detached) 运行容器,终端不会显示容器的日志。

🔌 -p 3306:3306
• 将 容器内部的 3306 端口(MySQL 默认端口)映射到 主机的 3306 端口。
• 格式是 -p 主机端口:容器端口,这样主机就能访问数据库服务。

📁 -v mysql8_conf:/etc/mysql/conf.d
• 把一个名为 mysql_conf 的 Docker 卷(volume)挂载到容器的 /etc/mysql/conf.d 目录。
• 作用:你可以把自定义的 MySQL 配置文件(如 my.cnf)放到这个卷中,MySQL 会自动加载。

📦 -v mysql8_data:/var/lib/mysql
• 把名为 mysql_data 的卷挂载到 MySQL 的 数据目录。
• 保证数据库数据持久化,即使容器重启或删除,数据不会丢失。

🔑 -e MYSQL_ROOT_PASSWORD=1234
• 设置 MySQL 的 root 用户密码为 1234。
• 这是 mysql:8.0.30 镜像要求的初始化密码环境变量,否则容器会启动失败。

🧾 --name mysql
• 给容器取一个名字叫 mysql。
• 这样你可以通过名字来操作容器,例如:docker stop mysql,而不需要记住容器 ID。

♻️ --restart=always
• 设置容器的自动重启策略为 always:
• Docker 启动时自动重启容器。
• 如果容器意外退出,也会自动重启。

🔐 --privileged
• 让容器拥有更高权限,类似于“超级用户模式”。
• 通常用于容器需要访问主机硬件或修改内核设置等特殊场景。
• 注意:不建议在非必要场合使用,存在安全风险。

🐬 mysql:8.0.30
• 使用的镜像是 mysql,版本为 8.0.30。
• 如果本地没有这个镜像,Docker 会从 Docker Hub 拉取。

  • 等待安装完成
    在这里插入图片描述

测试远程连接

1、先从最简单的终端开始

mysql -h yourLinuxIp -P 3306 -u root -p
# 如果用的是默认端口 -P 3306 可以省略 ,大P指定端口, 小p指定密码

回车输入密码
在这里插入图片描述

2、使用Navicat连接

在这里插入图片描述

测试连接:MySQL8版本,图形连接时还会出现如下问题
配置新连接报错:错误号码 2058,出现这个原因是MySQL 8 之前的版本中加密规则是mysql_native_password,而在MySQL 8之后,加密规则是caching_sha2_password

解决方案:

方案一(推荐):升级SQLyog和Navicat(因此,新版SQLyog和Navicat不会出现此问题)

方案二:把MySQL用户登录密码加密规则还原成mysql_native_password。

解决方案: 登录你的 MySQL 数据库 登录你的 MySQL 数据库

# 用方法1先连接到mysql

#修改默认密码校验方式
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '1111';
#ALTER USER: 修改用户信息。
#'root'@'%': 代表用户名是 root,% 是通配符,表示允许从任意主机连接(远程连接)。
#IDENTIFIED WITH mysql_native_password: 指定使用 mysql_native_password 插件进行身份验证(这是 MySQL 较早期版本使用的认证方式)。
#BY '1234': 设置新密码为 1111。
# 执行刷新权限在重新连接即可
FLUSH PRIVILEGES;

---- 到这里安装就已经结束了,下面是一些常见配置, 是一些了解的内容

二、mysql字符集

1、默认字符集

MySQL 8版本之前,默认字符集为 latin1(ISO-8859-1) ,不支持中文,使用前必须设置字符集为utf8(utf8mb3)或utf8mb4。从MySQL 8开始,数据库的默认字符集为 utf8mb4 ,从而避免中文乱码的问题。

-- 查看MySQL使用的字符集
SHOW VARIABLES LIKE '%char%';

2、 更改字符集

具体步骤:

1、编辑MySQL配置文件:打开MySQL的配置文件,通常是my.cnf(Linux)或my.ini(Windows)。可以使用文本编辑器打开该文件。
忘记挂载配置文件的目录可以通过查看

docker inspect  容器名	

在这里插入图片描述
2.切换到此目录,创建my.cnf配置文件

cd /var/lib/docker/volumes/mysql_conf/_data
cd conf.d/
vim my.cnf
#i进入插入模式复制一下配置, 按ESC输入wq保存退出

在这里插入图片描述

3、添加字符集设置:在 [mysqld] 部分添加以下两行配置,用于设置默认字符集为UTF-8:

[mysqld]
character-set-server=utf8
collation-server=utf8_general_ci

这将设置MySQL服务器的默认字符集为UTF-8,并使用utf8_general_ci作为默认的排序规则。

4、保存并关闭配置文件:保存对配置文件的修改,并关闭文本编辑器。

5、重启MySQL服务:重启MySQL服
务,以使配置更改生效。

docker restart mysql
# docker restart 容器名

查看是否生效
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述

3、 utf8与utf8mb4

utf8 字符集表示一个字符需要使用1~4个字节,但是我们常用的一些字符使用1~3个字节就可以表示了。而字符集表示一个字符所用的最大字节长度,在某些方面会影响系统的存储和性能,所以,设计MySQL的设计者偷偷的定义了两个概念:

utf8mb3 :utf8mb3 阉割过的 utf8 字符集,只使用1~3个字节表示字符(无法存储emoji表情)。

utf8mb4:utf8mb4正宗的 utf8 字符集,使用1~4个字节表示字符。

注意:MySQL5.7中的utf8是utf8mb3字符集 , MySQL8.0中的utf8是utf8mb4字符集

三、 SQL大小写规范

1、 Windows和Linux的区别

**Windows环境:**全部不区分大小写

Linux环境:

1、数据库名、表名、表的别名、变量名严格【区分大小写】;

2、列名与列的别名【不区分大小写】;

3、关键字、函数名称【不区分大小写】;

2、 Linux下大小写规则设置

在MySQL 8中设置的具体步骤为:

show variables like 'lower_case_table_names'
1、停止MySQL服务 
2、删除数据目录,即删除 /var/lib/mysql 目录 
3、在MySQL配置文件(/etc/my.cnf )的 [mysqld] 中添加 lower_case_table_names=1 
  • 注意:不建议在开发过程中修改此参数,将会丢失所有数据。

四、 sql_mode

1、sql_mode简介

sql_mode是MySQL中的一个系统变量,用于控制MySQL服务器在执行SQL语句时的行为和规则。它定义了MySQL对于SQL语句的语法、数据校验和处理方式的严格程度。

sql_mode可以通过设置来改变MySQL的默认行为,常见的sql_mode值包括:

1、STRICT_TRANS_TABLES:启用严格模式,要求插入或更新操作中的数据类型必须与表定义的数据类型完全匹配,否则会抛出错误。

2、NO_ZERO_IN_DATE:禁止在日期中使用零值,例如’0000-00-00’,否则会抛出错误。

3、NO_ZERO_DATE:禁止在日期或日期时间字段中使用零值,例如’0000-00-00’或’0000-00-00 00:00:00’,否则会抛出错误。

4、ERROR_FOR_DIVISION_BY_ZERO:当除数为零时,执行除法运算会抛出错误。

5、ONLY_FULL_GROUP_BY(重点了解面试):要求GROUP BY子句中的列必须出现在SELECT列表中,或者是聚合函数的参数,否则会抛出错误。

6、ANSI_QUOTES:启用ANSI_QUOTES模式,要求使用双引号来引用字符串,而不是单引号。

除了上述常见的sql_mode值,还有其他一些选项可以根据需要进行配置。

可以通过以下方式查看当前的sql_mode设置:

SHOW VARIABLES LIKE 'sql_mode';

2、 更改sql_mode

临时设置

-- 全局针对所有的客户端连接有效,要重新启动客户端生效,重启MySQL服务后失效
SET GLOBAL sql_mode = 'mode1,model2,...'; 
-- 当前会话生效,关闭当前会话就不生效了。可以省略SESSION关键字
SET SESSION sql_mode = 'mode1,model2,...';

永久设置

在mysql配置文件中配置,永久生效:在mysql配置文件中配置,永久生效:在宿主机上执行以下命令,创建配置文件:

cd /var/lib/docker/volumes/mysql_conf/_data
cd conf.d/
vim my.cnf

编辑配置文件

[mysqld]
sql-mode = "mode1,model2,..."

重启mysql容器

docker restart mysql

案例演示(ONLY_FULL_GROUP_BY)

建表并插入数据:

CREATE DATABASE test;
USE test;
CREATE TABLE employee(
id INT,
`name` VARCHAR(16),
age INT,
dept INT);
INSERT INTO employee VALUES(1,'zhang3',33,101);
INSERT INTO employee VALUES(2,'li4',34,101);
INSERT INTO employee VALUES(3,'wang5',34,102);
INSERT INTO employee VALUES(4,'zhao6',34,102);
INSERT INTO employee VALUES(5,'tian7',36,102);
  • 需求:查询每个部门年龄最大的人
-- 错误演示
-- 在SQL_MODE 约束 ONLY_FULL_GROUP_BY的情况下,分组时,select 后必须跟聚合函数(max min avg sum count),或者分组字段,name不满足上述情况所以报错
SELECT `name`, dept, MAX(age) FROM employee GROUP BY dept; 

1055 - Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column ‘testdb.employee.name’ which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by

  • 非 “ONLY_FULL_GROUP_BY” 模式下可以正常执行,但是得到的是错误的结果:
    在这里插入图片描述

在这里插入图片描述

-- 不推荐设置,这里只是演示, 临时设置关闭此次连接就会失效
-- 把所有的模式全部清空
SET SESSION sql_mode = '';   

正确的查询方式:查询应该分两个步骤:

1、查询每个部门最大的年龄

2、查询人

正确的语句:

 SELECT name, e.dept,max_age 
 from employee e
 inner join (SELECT  dept,max(age)  max_age 
	 from employee
	 group by dept) as  group_max_age on  e.dept=group_max_age.dept 
	 and e.age=group_max_age.max_age

如果修改了配置文件,测试完成后再将sql_mode设置回来:

SET SESSION sql_mode = 'ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

如果只是设置了,当前回话有效,直接关闭连接就可以.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2376271.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【SSM-SSM整合】将Spring、SpringMVC、Mybatis三者进行整合;本文阐述了几个核心原理知识点,附带对应的源码以及描述解析

SSM整合的基础jar包 需要创建的层级: controller层 该层下需要创建对应的控制器Servlet POJO文件夹 该层下需要创建与数据库对应的POJO类 mapper层 该层下需要创建Mapper的接口实现 service层 该层下需要创建业务层的接口及其接口实现 需要创建的配置文件&#x…

MYSQL数据库集群高可用和数据监控平台

项目环境 项目拓扑结构 软硬件环境清单 软硬件环境清单 软硬件环境清单 主机名IP硬件软件 master1 192.168.12.130 VIP:192.168.12.200 cpu:1颗2核 内 存:2GB HDD:20GB 网 络:NAT VmWare17 OpenEuler22.03 SP4 MySql8.0.3…

uni-app vue3版本打包h5后 页面跳转报错(uni[e] is not a function)

先看问题 解决方案 在HBuilderX项目中,若需在Web配置中显式关闭摇树优化(Tree Shaking),可以通过以下步骤实现:首先,在配置中打开摇树优化,然后再将其关闭。这样操作后,配置文件中会…

【Redis】缓存穿透、缓存雪崩、缓存击穿

1.缓存穿透 是指客户端请求的数据在缓存中和数据库中都不存在,这样缓存永远不会生效,导致请求直接穿透缓存到达数据库,给数据库带来压力的情况。 常见的解决方案有两种: 缓存空对象:实现简单,维护方便&am…

告别数据僵尸!Redis实现自动清理过期键值对

在这个数据爆炸的时代,内存就像珍贵的土地资源,而Redis则是这片土地上的智能管家。它不仅能高效存储数据,还能像秋叶定时凋零般,让键值对在指定时间自动消失。今天,就让我们揭开这项"数据保鲜"技术的奥秘。 …

web第三次课后作业--基于JDBC对mysql数据库的增删查改操作

一、工程搭建步骤 1.新建java项目,添加jdbc依赖 2.写java程序 3.添加mysql数据源,连接本地数据库 4.运行程序二、运行结果 三、代码 代码解析 加载数据驱动 try {Class.forName("com.mysql.jdbc.Driver"); } catch (ClassNotFoundExceptio…

[数据结构]5. 栈-Stack

栈-Stack 1. 介绍2. 栈的实现2.1 基于链表的实现2.2 基于数组的实现 3. 栈操作CreateInitilizateDestoryPushPopTopEmptySize 1. 介绍 栈(stack) 是一种遵循先入后出逻辑的线性数据结构。顶部称为“栈顶”,底部称为“栈底”。把元素添加到栈…

基于Spring Boot + Vue的高校心理教育辅导系统

一、项目背景介绍 随着高校对学生心理健康教育的重视,传统的人工心理辅导与测评模式已经难以满足广大师生的个性化需求。为了提高心理服务的效率、便捷度和覆盖范围,本项目开发了一个高校心理教育辅导系统,集成心理评测、辅导预约、留言交流…

JavaSwing之-JDialog

JavaSwing之-JDialog JDialog 是 Java Swing 中用于创建对话框窗口的容器类,继承自 Dialog 类(AWT),常用于显示临时信息、获取用户输入或执行模态操作。它是 javax.swing.JDialog 包中的类。 与 JFrame 不同的是,JDia…

【学习路线】 游戏客户端开发入门到进阶

目录 游戏客户端开发入门到进阶:系统学习路线与推荐书单一、学习总原则:从底层出发,项目驱动,持续迭代二、推荐学习路线图(初学者→进阶)第一阶段:语言基础与编程思维第二阶段:游戏开…

部署安装gitlab-ce-17.9.7-ce.0.el8.x86_64.rpm

目录 ​编辑 实验环境 所需软件 实验开始 安装部署gitlab171.配置清华源仓库(版本高的系统无需做)vim /etc/yum.repos.d/gitlab-ce.repo 2.提前下载包dnf localinstall gitlab-ce-17.9.7-ce.0.el8.x86_64.rpm --rocklinux 3.修改配…

备战菊厂笔试2-BFS记忆化MLE?用Set去重-Set会TLE?用SortedSet剪枝

目录 200.岛屿数量 不用getnei,直接在dfs判断,去掉解包 如果害怕栈溢出那么可以用bfs 2617.网格图中最少访问的格子数 注意特判! MLE主要是因为vis占用的内存过大 用SortedSet有序剪枝 什么是SortedSet? 基本性质 导入 …

【RabbitMQ】发布确认机制的具体实现

文章目录 模式介绍建立连接单独确认代码实现逻辑运行结果 批量确认代码实现逻辑运行结果 异步确认实现逻辑介绍代码实现逻辑运行结果 三种策略对比以及完整代码 模式介绍 作为消息中间件,都会面临消息丢失的问题,消息丢失大概分为三种情况: …

React状态管理-对state进行保留和重置

相同位置的相同组件会使得 state 被保留下来 当你勾选或清空复选框的时候&#xff0c;计数器 state 并没有被重置。不管 isFancy 是 true 还是 false&#xff0c;根组件 App 返回的 div 的第一个子组件都是 <Counter />&#xff1a; 你可能以为当你勾选复选框的时候 st…

vue和springboot交互数据,使用axios【跨域问题】

vue和springboot交互数据&#xff0c;使用axios【跨域问题】 提示&#xff1a;帮帮志会陆续更新非常多的IT技术知识&#xff0c;希望分享的内容对您有用。本章分享的是node.js和vue的使用。前后每一小节的内容是存在的有&#xff1a;学习and理解的关联性。【帮帮志系列文章】&…

AJAX 使用 和 HTTP

ajax学习 promise和 awit Node.js 和 webpack 前端工程化 Git工具 AJAX异步的JS和XML&#xff1a; 使用XML对象和服务器通信 在这里插入图片描述 统一资源定位符 URL HTTP 超文本传输协议 域名 资源路径 资源目录和类型 URL 查询参数 使用&#xff1f;表示之后的参数…

MySQL之基础事务

目录 引言&#xff1a; 什么是事务&#xff1f; 事务和锁 mysql数据库控制台事务的几个重要操作指令&#xff08;transaction.sql&#xff09; 1、事物操作示意图&#xff1a; 2.事务的隔离级别 四种隔离级别&#xff1a; 总结一下隔离指令 1. 查看当前隔离级别​​ …

MySQL基础关键_013_常用 DBA 命令

目 录 一、MySQL 用户信息存储位置 二、新建用户 1.创建本地用户 2.创建外网用户 三、用户授权 1.说明 2.实例 四、撤销授权 五、修改用户密码 六、修改用户名、主机名/IP地址 七、删除用户 八、数据备份 1.导出数据 2.导入数据 &#xff08;1&#xff09;方式…

java基础:异常体系

目录 一、java异常体系介绍二、异常1、运行时异常2、非运行时异常 三、错误四、异常的处理方式1、方式1&#xff1a;throws声明抛出异常1.1、throws关键字1.2、throw关键字 2、方式2&#xff1a;try-catch-finally 一、java异常体系介绍 异常体系图如下&#xff1a; Throwable…

记录算法笔记(20025.5.14)对称二叉树

给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;root [1,2,2,null,3,null,3] 输出&#xff1a;false 提示&#xff1a; 树中节点数目…