MySQL 9.0 参考手册  /  一般信息  /  MySQL 9.0 中的新增内容

1.4 MySQL 9.0 中的新增内容

本节概述了自 MySQL 8.4 以来,MySQL 9.0 中添加、弃用、更改和删除的内容。另一节列出了 MySQL 9.0 中添加、弃用或删除的 MySQL 服务器选项和变量;请参见 第 1.5 节,“MySQL 9.0 自 8.4 以来的服务器和状态变量及选项添加、弃用或删除”.

在 MySQL 9.0 中添加或更改的功能

以下功能已添加到 MySQL 9.0 中

  • JavaScript 存储程序。 MySQL 企业版现在支持使用 JavaScript 编写的存储程序,例如使用 CREATE FUNCTION 语句创建的此简单示例,以及此处显示的 JavaScript 代码

    CREATE FUNCTION gcd(a INT, b INT) 
    RETURNS INT 
    NO SQL 
    LANGUAGE JAVASCRIPT AS
      $mle$
        let x = Math.abs(a)
        let y = Math.abs(b)
        while(y) {
          var t = y
          y = x % y
          x = t
        }
        return x
      $mle$
    ;

    请参见 第 27.3.1 节,“JavaScript 存储程序的创建和管理”,其中描述了 JavaScript 存储程序创建和执行的基础知识。

    支持包括使用 JavaScript 编写的存储过程和存储函数,并由多语言引擎组件 (MLE) 提供。有关确定您的发行版是否包含此组件以及如何启用它的更多信息,请参见 第 7.5.6 节,“多语言引擎组件 (MLE)”.

    MySQL 中的 JavaScript 语言支持符合 ECMAScript 2023 规范,默认情况下使用严格模式。严格模式无法禁用。此实现包括所有标准 ECMAScript 库对象,如 ObjectFunctionMathDateString 等等。console.log()console.error() 也受支持(请参见 第 27.3.9 节,“JavaScript 存储程序示例”)。

    大多数 MySQL 数据类型都支持 JavaScript 存储程序的输入和输出参数,以及返回值类型。字符串必须使用 utf8mb4 字符集。MySQL BLOBTEXT 类型受支持,许多 MySQL 时间类型也受支持。 JSON 也受支持。 VECTOR 类型不受 MLE 组件或 JavaScript 存储程序的支持。有关更多信息,请参见 第 27.3.4 节,“JavaScript 存储程序数据类型和参数处理”第 27.3.8 节,“JavaScript 存储程序的限制和约束”.

    使用 JavaScript 编写的存储程序支持一个 API,用于执行 SQL 语句并检索结果,该 API 由 MLE 组件提供。请参见 第 27.3.6 节,“JavaScript SQL API”第 27.3.7 节,“使用 JavaScript SQL API”,以了解更多信息。准备好的语句也受 JavaScript 存储程序的支持;请参见 第 27.3.7.2 节,“准备好的语句”.

    MLE 组件提供了一些会话信息和管理功能,包括 mle_session_state()mle_session_reset()第 7.5.6.1 节,“MLE 组件选项和变量参考”第 7.5.6.2 节,“MLE 组件状态和会话信息” 提供了有关 MLE 配置选项和状态变量的信息;另请参见 第 27.3.5 节,“JavaScript 存储程序——会话信息和选项”.

    有关 JavaScript 存储程序的一般信息,请参见 第 27.3 节,“JavaScript 存储程序”.

  • VECTOR 类型支持。 MySQL 9.0 支持 VECTOR 列类型。向量是一种数据结构,它包含一个条目列表(4 字节浮点值),可以表示为二进制字符串值或列表格式的字符串。 VECTOR 列的声明带有一个最大长度或条目数(括号内);默认值为 2048,最大值为 16383。

    您可以使用此处显示的 CREATE TABLE 创建具有 VECTOR 列的 InnoDB

    mysql> CREATE TABLE v1 (c1 VECTOR(5000));
    Query OK, 0 rows affected (0.03 sec)

    向量列受到限制,其中一些限制列出如下

    • VECTOR 列不能用作任何类型的键。这包括主键、外键、唯一键和分区键。

    • 某些类型的 MySQL 函数和运算符不接受向量作为参数。这些包括但不限于数值函数和运算符、时间函数、全文搜索函数、XML 函数、位函数和 JSON 函数。

      向量可以与一些但并非所有字符串和加密函数一起使用。有关这些函数的更完整信息,请参见 VECTOR 支持和不支持的函数.

    • VECTOR 无法与任何其他类型进行比较,并且只能与另一个 VECTOR 进行相等比较。

    • VECTOR 列当前不支持 NDB 表。

    VECTOR_DIM()(也添加到 MySQL 9.0 中)返回向量的长度。提供用于在表示形式之间转换的函数。 STRING_TO_VECTOR()(别名:TO_VECTOR())获取向量的列表格式表示并返回二进制字符串表示;VECTOR_TO_STRING()(别名:FROM_VECTOR())执行相反的操作,如下所示

    mysql> SELECT STRING_TO_VECTOR('[2, 3, 5, 7]');
    +------------------------------------------------------+
    | TO_VECTOR('[2, 3, 5, 7]')                            |
    +------------------------------------------------------+
    | 0x00000040000040400000A0400000E040                   |
    +------------------------------------------------------+
    1 row in set (0.00 sec)
    
    mysql> SELECT VECTOR_TO_STRING(0x00000040000040400000A0400000E040);
    +------------------------------------------------------+
    | VECTOR_TO_STRING(0x00000040000040400000A0400000E040) |
    +------------------------------------------------------+
    | [2.00000e+00,3.00000e+00,5.00000e+00,7.00000e+00]    |
    +------------------------------------------------------+
    1 row in set (0.00 sec)

    有关更多信息和示例,请参见 第 13.3.5 节,“VECTOR 类型”第 14.21 节,“向量函数”.

  • 内联和隐式外键约束。 MySQL 现在强制执行内联外键规范,这些规范以前被解析器接受,但被忽略。MySQL 9.0 还接受对父表主键列的隐式引用。

    考虑由以下语句创建的父表 person

    CREATE TABLE person (
        id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        name CHAR(60) NOT NULL
    );

    要创建一个名为 shirt 的表,该表具有指向 person 的外键 owner,MySQL 现在根据标准接受并正确处理此处显示的任何 CREATE TABLE 语句

    CREATE TABLE shirt (
        id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        style ENUM('tee', 'polo', 'dress') NOT NULL,
        color ENUM('red', 'blue', 'yellow', 'white', 'black') NOT NULL,
        owner SMALLINT UNSIGNED NOT NULL,
        
        FOREIGN KEY (owner) REFERENCES person (id)
    );
    
    CREATE TABLE shirt (
        id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        style ENUM('tee', 'polo', 'dress') NOT NULL,
        color ENUM('red', 'blue', 'yellow', 'white', 'black') NOT NULL,
        owner SMALLINT UNSIGNED NOT NULL,
        
        FOREIGN KEY (owner) REFERENCES person
    );
    
    CREATE TABLE shirt (
        id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        style ENUM('tee', 'polo', 'dress') NOT NULL,
        color ENUM('red', 'blue', 'yellow', 'white', 'black') NOT NULL,
        owner SMALLINT UNSIGNED NOT NULL REFERENCES person (id)
    );
    
    CREATE TABLE shirt (
        id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
        style ENUM('tee', 'polo', 'dress') NOT NULL,
        color ENUM('red', 'blue', 'yellow', 'white', 'black') NOT NULL,
        owner SMALLINT UNSIGNED NOT NULL REFERENCES person
    );

    在以前版本的 MySQL 中,只有第一个显示的语句才会创建外键。

    有关更多信息,请参见 第 15.1.20.5 节,“FOREIGN KEY 约束”.

  • 保存来自 EXPLAIN ANALYZE INTO 的 JSON 输出。 现在支持使用此处显示的语法将来自 EXPLAIN ANALYZEJSON 输出保存到用户变量中

    EXPLAIN ANALYZE FORMAT=JSON INTO @variable select_stmt

    该变量随后可作为 JSON 参数用于任何 MySQL 的 JSON 函数(请参见 第 14.17 节,“JSON 函数”)。 INTO 子句仅支持 FORMAT=JSON;必须显式指定 FORMAT。此形式的 EXPLAIN ANALYZE 也支持可选的 FOR SCHEMAFOR DATABASE 子句。

    注意

    此功能仅在 explain_json_format_version 服务器系统变量设置为 2 时可用;否则,尝试使用它将引发 ER_EXPLAIN_ANALYZE_JSON_FORMAT_VERSION_NOT_SUPPORTED (EXPLAIN ANALYZE 不支持 FORMAT=JSON 且 explain_json_format_version=1)。

    有关更多信息和示例,请参见 获取执行计划信息

  • 预处理语句中的事件 DDL。 从 MySQL 9.0.0 开始,以下语句可以被预处理

    这些语句不支持位置参数 (? 占位符);您必须从字符串文字、系统变量和用户变量的某种组合中组装要预处理的语句的文本。 在可重复使用的方式下实现此目的的一种方法是,例如,在存储过程的主体中组装 CREATE EVENT 语句的文本,将语句的任何可变部分作为 IN 参数传递给存储过程;使用 PREPARE 预处理组装好的文本;使用所需的参数值调用过程。 有关更多信息,请参见 PREPARE、EXECUTE 和 DEALLOCATE PREPARE 语句 以及 预处理语句中允许的 SQL 语法。 有关示例,请参见 第 15.1.13 节,“CREATE EVENT 语句”

  • Performance Schema 系统变量表。 MySQL 9.0 在 Performance Schema 中添加了两个新表,它们提供有关服务器系统变量的信息。 这些表列在下面

    • variables_metadata 表提供有关系统变量的常规信息。 此信息包括 MySQL 服务器识别的每个系统变量的名称、范围、类型、范围(如果适用)和描述。

      此表中的两列 (MIN_VALUEMAX_VALUE) 旨在替换 variables_info 表的已弃用列。

    • global_variable_attributes 表提供有关服务器分配给全局系统变量的属性-值对的信息。

    有关更多信息,请参见 第 29.12.14 节,“Performance Schema 系统变量表”

MySQL 9.0 中弃用的功能

以下功能在 MySQL 9.0 中已弃用,可能会在将来的系列中删除。 如果显示了替代方案,应用程序应更新为使用它们。

对于在 MySQL 9.0 中弃用并在更高版本的 MySQL 中删除的功能的应用程序,语句在从 MySQL 9.0 源代码复制到运行更高版本的副本时可能会失败,或者对源代码和副本具有不同的效果。 为了避免此类问题,应修改使用 9.0 中弃用功能的应用程序以避免使用它们,并在可能的情况下使用替代方案。

  • Performance Schema variables_info 表列。 Performance Schema variables_info 表的 MIN_VALUEMAX_VALUE 列现在已弃用,并且将在将来的 MySQL 版本中被删除。 相反,请使用 variables_metadata 表的列(参见 MySQL 9.0 中添加或更改的功能),它们具有相同的名称。

  • 更新事务表和非事务表的事务。 MySQL 9.0.0 弃用了更新事务表以及非事务表或非可组合表的语句。 现在,这种事务会导致将弃用警告写入客户端和错误日志。 只有 InnoDBBLACKHOLE 存储引擎是事务性的和可组合的 (NDBCLUSTER 是事务性的,但不可组合)。 这意味着只有此处显示的存储引擎组合 不会 触发弃用警告

    • InnoDBBLACKHOLE

    • MyISAMMerge

    • performance_schema 和任何其他存储引擎

    • TempTable 和任何其他存储引擎

    有关更多信息,请参见 第 19.5.1.36 节,“复制和事务”

MySQL 9.0 中删除的功能

以下项目已过时,并在 MySQL 9.0 中被删除。 如果显示了替代方案,应用程序应更新为使用它们。

对于使用 MySQL 9.0 中删除的功能的 MySQL 8.4 应用程序,语句在从 MySQL 8.4 源代码复制到 MySQL 9.0 副本时可能会失败,或者对源代码和副本具有不同的效果。 为了避免此类问题,应修改使用 MySQL 9.0 中删除的功能的应用程序以避免使用它们,并在可能的情况下使用替代方案。

  • mysql_native_password 插件。 在 MySQL 8.0 中弃用的 mysql_native_password 身份验证插件已被删除。 服务器现在拒绝来自没有 CLIENT_PLUGIN_AUTH 功能的旧客户端程序的 mysql_native 身份验证请求。

    由于此更改,以下服务器选项和变量也被删除

    • 服务器选项 --mysql-native-password

    • 服务器选项 --mysql-native-password-proxy-users

    • 服务器系统变量 default_authentication_plugin

    为了向后兼容性,mysql_native_password 在客户端上仍然可用,以便 MySQL 9.0 客户端程序可以连接到早期版本的 MySQL 服务器。 在 MySQL 9.0 中,以前版本客户端程序中内置的 MySQL 本机身份验证插件已转换为必须在运行时加载的插件。

    有关更多信息,请参见 第 8.4.1 节,“身份验证插件”