MySQL上新:MySQL 9.1.0发布

MySQL 9.1.0 已经于 2024 年 10 月 15 日正式发布。这是一个创新版本,增加了一些新功能、修复了一些问题并且弃用了一些旧功能。

同时发布的还有 MySQL 8.4.3 以及 MySQL 8.0.40。

以下是该版本包含的部分更新。

原子DDL

在该版本之前,虽然 CREATE DATABASE 以及 DROP DATABASE 具有原子性,但是并非具有完全崩溃安全性,可能导致以下问题:

  • 如果 CREATE DATABASE 语句在创建数据库目录之后,但没有提交事务之前失败,数据字典不会感知该数据库的存在。此时,文件系统中的数据库目录需要手动清除。
  • 如果文件系统错误或者异常关闭导致 DROP DATABASE 语句没有成功删除数据库目录,事务并非总会回滚。此时也需要手动干预解决问题。

从新版开始,只要涉及的数据库都使用支持原子 DDL 语句的存储引擎(例如 InnoDB),这些语句就会具有完全的原子性和崩溃安全性。

SQL函数

修复了 UNION 查询中 DATABASE() 函数结果被截断的缺陷。

修复了 SUM() 函数某些情况下指定 DISTINCT 选项时的错误,例如:

sql 复制代码
mysql> SELECT SUM(b'1100'), SUM(DISTINCT b'1100');
+--------------+-----------------------+
| sum(b'1100') | sum(DISTINCT b'1100') |
+--------------+-----------------------+
|           12 |                     9 |
+--------------+-----------------------+

这个问题的原因在于使用了 DISTINCT 时会创建一个临时表,用于数据去重。该版本之前的临时表没有考虑数据类型和长度,导致了数据问题,新版本解决了这个问题。

SQL语法

在该版本之前允许以下形式的查询:

sql 复制代码
SELECT test.dt.a FROM (SELECT 1 AS a) AS dt;

该查询使用了 db_name.tbl_name.col_name 引用派生表中的字段,这种形式违反了 SQL 标准。与此类似的还有通用表表达式中的字段引用。新版本不再支持这种语法。

新版本增加了 CREATE VIEW 语句的 IF NOT EXISTS 选项。如果被创建的视图不存在,直接创建视图;如果视图已经存在,该语句显示成功执行,但是不会修改视图定义,并且会产生一个警告信息:

sql 复制代码
mysql> CREATE VIEW v1 AS SELECT c1, c3 FROM t1;
Query OK, 0 rows affected (0.01 sec)

mysql> CREATE VIEW v1 AS SELECT c2 FROM t1;
ERROR 1050 (42S01): Table 'v1' already exists

mysql> CREATE VIEW IF NOT EXISTS v1 AS SELECT c2 FROM t1;
Query OK, 0 rows affected, 1 warning (0.01 sec)

mysql> SHOW WARNINGS;
+-------+------+---------------------------+
| Level | Code | Message                   |
+-------+------+---------------------------+
| Note  | 1050 | Table 'v1' already exists |
+-------+------+---------------------------+
1 row in set (0.00 sec)

mysql> SHOW CREATE VIEW v1\G
*************************** 1. row ***************************
                View: v1
         Create View: CREATE ALGORITHM=UNDEFINED DEFINER=`vuser`@`localhost` SQL 
SECURITY DEFINER VIEW `v1` AS select `t1`.`c1` AS `c1`,`t1`.`c3` AS `c3` from `t1`
character_set_client: utf8mb4
collation_connection: utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

IF NOT EXISTS 选项和 OR REPLACE 选项不兼容,一个 CREATE VIEW 语句中不能同时指定这两个子句。

向量数据类型

新版本中的 STRING_TO_VECTOR() 函数允许字符形式的 VECTOR 数据中包含尾部空白符。解析器可以截断数字以及中括号前后的空白符,例如:

  • "[1 ,2]"
  • "[1,2 ]"
  • " [1,2]"
  • "[1,2] "

新版本中的 JavaScript 存储程序完全支持 VECTOR 类型,包括输入参数、输出参数、预编译语句 bind() 参数以及返回结果。

完整信息

以上只是介绍了部分更新,完整内容可以参考发现说明:

https://dev.mysql.com/doc/relnotes/mysql/9.1/en/news-9-1-0.html

相关推荐
sheng12345678rui28 分钟前
mfc100.dll丢失的解决方法-电脑基础知识
数据库·microsoft·电脑·dll修复工具·1024程序员节
nice6666037 分钟前
初识JDBC
java·数据库·sql·mysql·idea
计算机学姐38 分钟前
基于SpringBoot的汽车票网上预订系统
java·vue.js·spring boot·后端·mysql·java-ee·mybatis
贩卖纯净水.1 小时前
MySQL架构和存储引擎
数据库·mysql·架构
java1234_小锋1 小时前
为什么需要MQ消息系统,mysql 不能满足需求吗?
数据库·mysql
Karoku0662 小时前
【缓存与加速技术实践】Redis 高可用
运维·服务器·数据库·redis·mysql·缓存
Karoku0662 小时前
【缓存与加速技术实践】Redis 主从复制
linux·运维·服务器·数据库·redis·缓存
尘浮生3 小时前
Java项目实战II基于Spring Boot的火锅店管理系统设计与实现(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·微信小程序·旅游
海波东3 小时前
oracle和mysql的区别常用的sql语句
sql·mysql·oracle
FIN技术铺3 小时前
Redis有什么不一样?
数据库·redis·缓存