MySQL上新:MySQL 9.1.0发布

文摘   2024-10-16 21:01   北京  

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 选项时的错误,例如:

mysql> SELECT SUM(b'1100'), SUM(DISTINCT b'1100');
+--------------+-----------------------+
| sum(b'1100') | sum(DISTINCT b'1100') |
+--------------+-----------------------+
| 12 | 9 |
+--------------+-----------------------+

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

SQL语法

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

SELECT test.dt.a FROM (SELECT 1 AS a) AS dt;

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

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

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

SQL编程思想
专注于数据库领域和SQL编程知识的分享。
 最新文章