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

相关推荐
你的微笑,乱了夏天2 分钟前
linux centos 7 安装 mongodb7
数据库·mongodb
工业甲酰苯胺13 分钟前
分布式系统架构:服务容错
数据库·架构
独行soc1 小时前
#渗透测试#漏洞挖掘#红蓝攻防#护网#sql注入介绍08-基于时间延迟的SQL注入(Time-Based SQL Injection)
数据库·sql·安全·渗透测试·漏洞挖掘
White_Mountain2 小时前
在Ubuntu中配置mysql,并允许外部访问数据库
数据库·mysql·ubuntu
Code apprenticeship2 小时前
怎么利用Redis实现延时队列?
数据库·redis·缓存
百度智能云技术站2 小时前
广告投放系统成本降低 70%+,基于 Redis 容量型数据库 PegaDB 的方案设计和业务实践
数据库·redis·oracle
老王笔记2 小时前
GTID下复制问题和解决
mysql
装不满的克莱因瓶2 小时前
【Redis经典面试题六】Redis的持久化机制是怎样的?
java·数据库·redis·持久化·aof·rdb
Lojarro3 小时前
【Spring】Spring框架之-AOP
java·mysql·spring
梦想平凡3 小时前
PHP 微信棋牌开发全解析:高级教程
android·数据库·oracle