暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

《MySQL 9.0 参考手册》- MySQL 9.0 中的新增功能

通讯员 2024-11-08
54

本节总结了自 MySQL 8.4 以来 MySQL 9.0 中添加、弃用、更改和删除的内容。配套部分列出了 MySQL 9.0 中已添加、弃用或删除的 MySQL 服务器选项和变量;参见第 1.5 节 ,“自 8.4 以来在 MySQL 9.0 中添加、弃用或删除的服务器和状态变量和选项”。

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 规范,并默认使用 strict 模式。无法禁用 Strict 模式。此实现包括所有标准 ECMAScript 库对象,例如 ObjectFunctionMathDateString 等。还支持 console.log() 和 console.error() (请参见第 27.3.9 节 “ JavaScript 存储程序示例”)。

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

    用 JavaScript 编写的存储程序支持由 MLE 组件提供的用于执行和检索 SQL 语句结果的 API。有关更多信息,请参见第 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 进行比较,以确保相等。

    • NDB 表当前不支持 VECTOR 列。

    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
    );

    要创建具有外键所有者 on person 的 table 衬衫,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 输出。 现在支持使用 synatx 将 EXPLAIN ANALYZE 的 JSON 输出保存到用户变量中,如下所示:

    EXPLAIN ANALYZE FORMAT=JSON INTO @variable select_stmt

    该变量随后可以用作任何 MySQL 的 JSON 函数的 JSON 参数(请参见第 14.17 节 “ JSON 函数”)。只有 FORMAT=JSON 支持 INTO 子句;FORMAT 必须显式指定。这种形式的 EXPLAIN ANALYZE 还支持可选的 FOR SCHEMA 或 FOR DATABASE 子句。

     注意

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

    有关其他信息和示例,请参阅 Obtaining Execution Plan Information 。

  • 准备好的语句中的事件 DDL。 从 MySQL 9.0.0 开始,可以准备以下语句:

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

  • Performance Schema 系统变量表。 MySQL 9.0 向性能架构添加了两个新表,它们提供有关服务器系统变量的信息。这些表格列在这里:

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

      此表中的两列(MIN_VALUE 和 MAX_VALUE)用于替换 variables_info 表中已弃用的列。

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

    有关更多信息,请参见第 29.12.14 节 “性能模式系统变量表”。

  • EXPLAIN FORMAT=JSON 增强功能。  EXPLAIN FORMAT=JSON now 的输出包含有关联接列的信息。

  • 与 LIMIT 1 相关的子查询。 以前,为了有资格转换为派生表的外部左联接,子查询不能包含 LIMIT 子句。在 MySQL 9.0 中,此限制略有放宽,因此现在可以以这种方式转换包含 LIMIT 1 的子查询。

    LIMIT 子句必须仅使用文本 1。如果 LIMIT 子句包含任何其他值,或者它使用占位符 () 或变量,则无法使用子查询到派生的转换来优化子查询。

    有关更多信息,请参见第 15.2.15.7 节 “相关子查询”。

MySQL 9.0 中不推荐使用的功能

以下功能在 MySQL 9.0 中已弃用,可能会在以后的系列中删除。在显示替代方案的情况下,应更新应用程序以使用它们。

对于使用 MySQL 9.0 中已弃用的功能且已在更高版本的 MySQL 版本中删除的应用程序,语句在从 MySQL 9.0 源复制到运行更高版本的副本时可能会失败,或者可能对源和副本产生不同的影响。为避免此类问题,应修改使用 9.0 中已弃用功能的应用程序以避免这些问题,并尽可能使用替代方法。

  • Performance Schema variables_info table 列。 Performance Schema variables_info 表的 MIN_VALUE 列和 MAX_VALUE 列现已弃用,并可能在未来的 MySQL 版本中删除。相反,请使用 variables_metadata 表中具有相同名称的列(请参阅 MySQL 9.0 中添加或更改的功能)。

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

    • InnoDB 和 BLACKHOLE

    • MyISAM 和合并

    • 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 节 “身份验证插件”。



最后修改时间:2024-11-08 10:49:27
文章转载自通讯员,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论