MySql 中文参考指南

1.4 What Is New in MySQL 9.0

本节总结了自 MySQL 8.4 以来对 MySQL 9.0 做出的新增、弃用、更改和移除内容。配套章节列出了 MySQL 9.0 中已新增、已弃用、或已移除的 MySQL 服务器选项和变量;请参阅 Section 1.5, “Server and Status Variables and Options Added, Deprecated, or Removed in MySQL 9.0 since 8.4”

Features Added or Changed in MySQL 9.0

MySQL 9.0 已新增以下功能:

  1. JavaScript 存储程序。MySQL Enterprise Edition 现包含对以 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$ ; ,请参阅 Section 27.3.1, “JavaScript Stored Program Creation and Management” ,其中描述了创建和执行 JavaScript 存储程序的基础知识。

Multilingual Engine Component(MLE)提供对以 JavaScript 编写的存储过程和存储函数的支持。有关确定分发中是否包含此组件以及如何启用它的详细信息,请参阅 Section 7.5.6, “Multilingual Engine Component (MLE)”

在 MySQL 中对 JavaScript 语言的支持符合 ECMAScript 2023 Specification并强制执行默认的严格模式。不能禁用严格模式。此实现包含所有标准 ECMAScript 库对象,例如 ObjectFunctionMathDateString_等。此外还支持 _console.log()_和 _console.error()(请参阅 Section 27.3.9, “JavaScript Stored Program Examples”)。

大多数 MySQL 数据类型都受 JavaScript 存储程序输入和输出参数以及返回数据类型的支持。字符串必须使用 utf8mb4 字符集。MySQL BLOBTEXT 类型受支持,许多 MySQL 时间类型也受支持。 JSON 也受支持。MLE 组件或 JavaScript 存储程序不支持 VECTOR 类型。有关更多信息,请参阅 Section 27.3.4, “JavaScript Stored Program Data Types and Argument Handling”Section 27.3.8, “JavaScript Stored Program Limitations and Restrictions”

以 JavaScript 编写的存储的程序支持一个 API 来执行 SQL 语句并从中检索结果,它由 MLE 组件提供。有关详细信息,请参阅 Section 27.3.6, “JavaScript SQL API”Section 27.3.7, “Using the JavaScript SQL API”。JavaScript 存储的程序中也支持预处理语句;请参阅 Section 27.3.7.2, “Prepared Statements”

有关 JavaScript 存储程序的一般信息,请参阅 Section 27.3, “JavaScript Stored Programs”

  1. 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 Supported and Unsupported Functions

不能将 _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)_有关更多信息和示例,请参阅链接:vector.html[第 13.3.5 节、“VECTOR 类型”] 和链接:vector-functions.html[第 14.21 节、“Vector 函数”]。----

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

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

向量可与某些(但并非所有)字符串和加密函数一起使用。有关这些函数的更完整信息,请参阅 VECTOR Supported and Unsupported Functions

  1. 不能将 _VECTOR_与任何其他类型进行比较,并且只能将其与另一个 _VECTOR_比较是否相等。

  2. VECTOR 目前不支持 NDB 表。

  3. 内联和隐式外键约束。MySQL 现在会执行以前已被解析器所接受但被忽略的内联外键规范。此外,MySQL 9.0 还接受父表主键列的隐式引用。

考虑以下语句创建的父表 personCREATE TABLE person ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name CHAR(60) NOT NULL ); 要创建外键 ownerperson 上的表 shirt ,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 的早期版本中,仅刚显示的第一个语句具有创建外键的效果。

有关详细信息,请参阅 Section 15.1.20.5, “FOREIGN KEY Constraints”

  1. 将 JSON 输出从 EXPLAIN ANALYZE 保存到中。现在支持将 JSONEXPLAIN ANALYZE 生成的输出保存到用户变量中,语法如下所示: EXPLAIN ANALYZE FORMAT=JSON INTO @_variable select_stmt_ 然后,该变量可以使用 MySQL 的任何 JSON 函数作为 JSON 参数(请参见 Section 14.17, “JSON Functions” )。 INTO 仅支持 FORMAT=JSONFORMAT 必须显式指定。这种形式的 EXPLAIN ANALYZE 还支持可选的 FOR SCHEMAFOR 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

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

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

这些语句不支持位置参数( ? 占位符);必须通过字符串文本、系统变量和用户变量的组合组装要准备的语句。以可重用方式完成此操作的一种方法是在存储过程的主体中组装 CREATE EVENT 语句的文本,将语句的任何可变部分作为 IN 参数传递给存储过程;使用 PREPARE 准备组装的文本;使用所需的参数值调用过程。有关更多信息,请参阅 PREPARE, EXECUTE, and DEALLOCATE PREPARE StatementsSQL Syntax Permitted in Prepared Statements 。有关示例,请参阅 Section 15.1.13, “CREATE EVENT Statement”

  1. CREATE EVENT

  2. ALTER EVENT

  3. DROP EVENT

  4. 性能架构系统变量表。MySQL 9.0 向性能架构添加了两个新表,它们提供了有关服务器系统变量的信息。这些表如下所示:

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

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

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

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

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

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

  2. EXPLAIN FORMAT=JSON 增强功能。 EXPLAIN FORMAT=JSON 的输出现在包括有关联接列的信息。

  3. 带 LIMIT 1 的相关子查询。以前,为了有资格转换为带有导出表的外部左联接,子查询不能包含 _LIMIT_子句。在 MySQL 9.0 中,此限制略微放宽,使得包含 _LIMIT 1_的子查询现在可以通过此方式进行转换。

LIMIT_子句只能使用文字 _1。如果 LIMIT_子句包含任何其他值,或者如果它使用占位符 (?_) 或变量,则无法使用子查询到导出转换来优化子查询。

有关更多信息,请参阅 Section 15.2.15.7, “Correlated Subqueries”

Features Deprecated in MySQL 9.0

MySQL 9.0 中弃用了以下功能,并可能在未来的系列中移除这些功能。如果显示了替代方法,则应用程序应该更新为使用它们。

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

  1. Performance Schema variables_info 表列。Performance Schema variables_info 表的 MIN_VALUEMAX_VALUE 列现在已弃用,可能会在将来的 MySQL 发行版中删除。请改用具有相同名称的 variables_metadata 表(请参阅 Features Added or Changed in MySQL 9.0 )的列。

  2. 更新事务和非事务表的交易。MySQL 9.0.0 不推荐同时更新事务表和非事务表或不可组合表的交易。这种交易现在会向客户端和错误日志写入不推荐警告。只有 InnoDBBLACKHOLE 存储引擎是事务性的和可组合的( NDBCLUSTER 是事务性的,但不可组合的)。这意味着这里显示的存储引擎的组合只会引发不推荐警告:

InnoDBBLACKHOLE

MyISAMMerge

_performance_schema_和任何其他存储引擎

_TempTable_和任何其他存储引擎

有关更多信息,请参阅 Section 19.5.1.36, “Replication and Transactions”

  1. InnoDB and BLACKHOLE

  2. MyISAM and Merge

  3. _performance_schema_和任何其他存储引擎

  4. _TempTable_和任何其他存储引擎

Features Removed in MySQL 9.0

以下是已过时并在 MySQL 9.0 中被移除的项目。在显示有替代方案的情况下,应用程序应更新以使用它们。

对于使用 MySQL 9.0 中已移除的功能的 MySQL 8.4 应用程序,从 MySQL 8.4 源复制到 MySQL 9.0 副本时,语句可能会失败,或对源和副本产生不同的影响。为了避免此类问题,应修改使用 MySQL 9.0 中移除的功能的应用程序以避免使用这些功能,并在可能的情况下使用替代方案。

  1. 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 本机验证插件已转换为必须在运行时加载的插件。

有关更多信息,请参阅 Section 8.4.1, “Authentication Plugins”

  1. The —​mysql-native-password server option

  2. The —​mysql-native-password-proxy-users server option

  3. _default_authentication_plugin_服务器系统变量