一定要看!MySQL5与MySQL8的区别
一、回顾JDBC的普通使用(以MySQL8.0为例)
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.28</version> </dependency>
driver=com.mysql.cj.jdbc.Driver url=jdbc:mysql://localhost:3306/(此处更改替换为你要访问的数据库的名字)?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false username=admin(用户名) password=1234567(密码)
- java.sql
- javax.sql
- mysql-conneter-java… 连接驱动(必须要导入)
1-1 执行JDBC时必须的步骤
package com.kuang.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.Statement; public class TestJDBC { public static void main(String[] args) throws Exception { //配置信息 // String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=UTC"; String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false"; String username="root"; String password="admin"; // 1. 加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 2. 连接数据库 Connection connection = DriverManager.getConnection(url, username, password); // 3. 向数据库发送SQL对象STATEMENT:CRUD Statement statement = connection.createStatement();//不安全 // 4.编写sql jdbc的套路是️死的,sql会变 String sql = "select * from users"; String sql2 = "delete from users where id = 1"; //受影响的行数 // int r = statement.executeQuery(sql); // 5. 执行SQL 返回一个结果集 ResultSet rs = statement.executeQuery(sql); while (rs.next()){ System.out.println("id = " + rs.getObject("id")); System.out.println("name " + rs.getObject("name")); System.out.println("password = " + rs.getObject("password")); System.out.println("email = " + rs.getObject("email")); System.out.println("birthday = " + rs.getObject("birthday")); } // 6. 关闭连接释放资源 原则 先开后关 rs.close(); statement.close(); connection.close(); } }
1-2 预编译的SQL
package com.kuang.test; import java.sql.*; public class TestJDBC2 { public static void main(String[] args) throws Exception { //配置信息 // String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=UTC"; String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false"; String username="root"; String password="admin"; // 1. 加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 2. 连接数据库 Connection connection = DriverManager.getConnection(url, username, password); // 3. 编写sql String sql = "insert into users(id,name,password,email,birthday) values (?,?,?,?,?)"; // 4. 预编译 PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setInt(1,6);//给第一个占位符?的值 preparedStatement.setString(2,"MadGod say");//给第二个占位符?的值 preparedStatement.setString(3,"15151");//给第三个占位符?的值 preparedStatement.setString(4,"dsaogj@google.com");//给第四个占位符?的值 preparedStatement.setDate(5,new Date(new java.util.Date().getTime()));//给第五个占位符?的值 注意util.date和sql.date // 5. 执行sql int i=preparedStatement.executeUpdate(); if (i>0){ System.out.println(" 插入成功 " ); } // 6. 关闭连接释放资源 原则 先开后关 preparedStatement.close(); connection.close(); } }
1-3 执行事务的SQL
package com.kuang.test; import com.mysql.cj.jdbc.exceptions.ConnectionFeatureNotAvailableException; import java.sql.Connection; import java.sql.Driver; import java.sql.DriverManager; import java.sql.SQLException; public class TestJDBC3 { public static void main(String[] args) { String url = "jdbc:mysql://localhost:3306/jdbc?useSSL=false&serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8&autoReconnect=true&failOverReadOnly=false"; String username="root"; String password="admin"; Connection connection=null; try { // 1. 加载驱动 Class.forName("com.mysql.cj.jdbc.Driver"); // 2. 连接数据库,代表数据库 connection = DriverManager.getConnection(url,username,password); // 3. 通知数据库开启事物,false表示开启 connection.setAutoCommit(false); String sql = "update account set money = money -200 where name='张三'"; connection.prepareStatement(sql).executeUpdate(); // 4. 制造错误 int i = 1/0; String sql2 = "update account set money = money+200 where name ='李四'"; connection.prepareStatement(sql2).executeUpdate(); connection.commit();//以上两条sql都执行成功了就提交事物 System.out.println(" sql1 sql2 执行成功 coding: SUCCESS-accept "); }catch (Exception e){ try { // 如果出现了异常,就进行回滚 connection.rollback(); } catch (SQLException ex) { throw new RuntimeException(ex); } }finally { try { connection.close(); } catch (SQLException e) { throw new RuntimeException(e); } } } }
二、核心功能差异
-
JSON支持
-
MySQL 5:通过字符串存储和处理JSON数据,操作复杂且效率低14。
-
MySQL 8:原生支持JSON数据类型及相关函数,简化了JSON数据的存储和查询,提升了处理效率。
-
-
窗口函数与CTE(公共表表达式)
-
MySQL 5:不支持窗口函数和CTE,复杂分析需依赖子查询。
-
MySQL 8:新增窗口函数(如
ROW_NUMBER
、RANK
)和CTE,支持更灵活的数据分析与查询优化。
-
-
事务管理
-
MySQL 5:事务处理较弱,ACID特性支持有限。
-
三、性能优化
-
-
查询速度与并发
-
MySQL 8:优化了查询执行引擎和索引算法,官方称其性能比MySQL 5快2倍,高并发场景下甚至可达5-30倍。
-
MySQL 5:索引和锁机制较简单,高负载下性能可能受限。
-
-
存储引擎
-
MySQL 8:默认使用InnoDB Cluster,支持自动故障转移和组复制,提升高可用性;新增MyRocks引擎,优化写入性能37。
-
-
数据压缩与内存管理
-
MySQL 8:引入高效数据压缩技术,减少存储占用并提升查询效率;改进内存管理,减少锁竞争
-
-
和隔离性,支持更严格的事务控制
-
四、安全性提升
-
加密与认证
-
MySQL 8:默认启用SSL/TLS加密,支持SHA-256密码和公钥加密插件;新增角色权限管理,细化访问控制。
-
MySQL 5:安全功能较基础,依赖手动配置加密和权限。
-
-
审计与日志
-
MySQL 8:增强操作日志和审计功能,支持用户行为追踪
-
五、配置与兼容性
-
驱动与连接配置
-
驱动类:MySQL 5使用
com.mysql.jdbc.Driver
,而MySQL 8需改用com.mysql.cj.jdbc.Driver
。 -
连接URL:MySQL 8需在JDBC URL中指定时区参数(如
?serverTimezone=UTC
),否则可能报错25。
-
-
字符编码
-
MySQL 8:默认字符集改为
utf8mb4
,支持更广泛的Unicode字符(如Emoji),而MySQL 5默认使用latin1
。
-
-
配置持久化
-
MySQL 8:通过
SET PERSIST
命令可将配置保存至mysqld-auto.cnf
,重启后生效,弥补了MySQL 5仅支持临时配置的不足。
-