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 已新增以下功能:
-
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 库对象,例如 Object、Function、Math、Date、String_等。此外还支持 _console.log()_和 _console.error()(请参阅 Section 27.3.9, “JavaScript Stored Program Examples”)。
大多数 MySQL 数据类型都受 JavaScript 存储程序输入和输出参数以及返回数据类型的支持。字符串必须使用 utf8mb4 字符集。MySQL BLOB 和 TEXT 类型受支持,许多 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”。
MLE 组件提供一些会话信息和管理函数,包括 mle_session_state() 和 mle_session_reset() 。 Section 7.5.6.1, “MLE Component Option and Variable reference” 和 Section 7.5.6.2, “MLE Component Status and Session Information” 提供有关 MLE 配置选项和状态变量的信息,另请参阅 Section 27.3.5, “JavaScript Stored Programs—Session Information and Options” 。
有关 JavaScript 存储程序的一般信息,请参阅 Section 27.3, “JavaScript Stored Programs”。
-
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 函数”]。----
-
_VECTOR_列不能用作任何类型的键。这包括主键、外键、唯一键和分区键。
-
某些类型的 MySQL 函数和运算符不接受向量作为参数。这些函数和运算符包括但不限于数字函数和运算符、时间函数、全文搜索函数、XML 函数、位函数和 JSON 函数。
向量可与某些(但并非所有)字符串和加密函数一起使用。有关这些函数的更完整信息,请参阅 VECTOR Supported and Unsupported Functions。
-
不能将 _VECTOR_与任何其他类型进行比较,并且只能将其与另一个 _VECTOR_比较是否相等。
-
VECTOR 目前不支持 NDB 表。
-
内联和隐式外键约束。MySQL 现在会执行以前已被解析器所接受但被忽略的内联外键规范。此外,MySQL 9.0 还接受父表主键列的隐式引用。
考虑以下语句创建的父表 person : CREATE TABLE person ( id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY, name CHAR(60) NOT NULL ); 要创建外键 owner 在 person 上的表 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”。
-
将 JSON 输出从 EXPLAIN ANALYZE 保存到中。现在支持将 JSON 从 EXPLAIN ANALYZE 生成的输出保存到用户变量中,语法如下所示: EXPLAIN ANALYZE FORMAT=JSON INTO @_variable select_stmt_ 然后,该变量可以使用 MySQL 的任何 JSON 函数作为 JSON 参数(请参见 Section 14.17, “JSON Functions” )。 INTO 仅支持 FORMAT=JSON ; 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。
此功能仅在 explain_json_format_version 服务器系统变量设置为 2 的情况下才可用;否则,尝试使用它会导致 ER_EXPLAIN_ANALYZE_JSON_FORMAT_VERSION_NOT_SUPPORTED (EXPLAIN ANALYZE 不支持 explain_json_format_version=1 时 FORMAT=JSON)。 |
-
已准备语句中的事件 DDL。从 MySQL 9.0.0 开始,可以准备以下语句:
这些语句不支持位置参数( ? 占位符);必须通过字符串文本、系统变量和用户变量的组合组装要准备的语句。以可重用方式完成此操作的一种方法是在存储过程的主体中组装 CREATE EVENT 语句的文本,将语句的任何可变部分作为 IN 参数传递给存储过程;使用 PREPARE 准备组装的文本;使用所需的参数值调用过程。有关更多信息,请参阅 PREPARE, EXECUTE, and DEALLOCATE PREPARE Statements 和 SQL Syntax Permitted in Prepared Statements 。有关示例,请参阅 Section 15.1.13, “CREATE EVENT Statement” 。
-
性能架构系统变量表。MySQL 9.0 向性能架构添加了两个新表,它们提供了有关服务器系统变量的信息。这些表如下所示:
variables_metadata 表提供有关系统变量的一般信息。此信息包括 MySQL 服务器识别的每个系统变量的名称、范围、类型、范围(如适用)和说明。
此表中的两列( MIN_VALUE 和 MAX_VALUE )旨在替换 variables_info 表的已弃用列。
global_variable_attributes 表提供有关服务器分配给全局系统变量的属性值对的信息。
-
variables_metadata 表提供有关系统变量的一般信息。此信息包括 MySQL 服务器识别的每个系统变量的名称、范围、类型、范围(如适用)和说明。
此表中的两列( MIN_VALUE 和 MAX_VALUE )旨在替换 variables_info 表的已弃用列。
-
global_variable_attributes 表提供有关服务器分配给全局系统变量的属性值对的信息。
-
EXPLAIN FORMAT=JSON 增强功能。 EXPLAIN FORMAT=JSON 的输出现在包括有关联接列的信息。
-
带 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 中已弃用功能的应用程序以避免使用它们,并尽可能使用替代方法。
-
Performance Schema variables_info 表列。Performance Schema variables_info 表的 MIN_VALUE 和 MAX_VALUE 列现在已弃用,可能会在将来的 MySQL 发行版中删除。请改用具有相同名称的 variables_metadata 表(请参阅 Features Added or Changed in MySQL 9.0 )的列。
-
更新事务和非事务表的交易。MySQL 9.0.0 不推荐同时更新事务表和非事务表或不可组合表的交易。这种交易现在会向客户端和错误日志写入不推荐警告。只有 InnoDB 和 BLACKHOLE 存储引擎是事务性的和可组合的( NDBCLUSTER 是事务性的,但不可组合的)。这意味着这里显示的存储引擎的组合只会引发不推荐警告:
InnoDB 和 BLACKHOLE
MyISAM 和 Merge
_performance_schema_和任何其他存储引擎
_TempTable_和任何其他存储引擎
-
InnoDB and BLACKHOLE
-
MyISAM and Merge
-
_performance_schema_和任何其他存储引擎
-
_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 中移除的功能的应用程序以避免使用这些功能,并在可能的情况下使用替代方案。
-
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”。
-
The —mysql-native-password server option
-
The —mysql-native-password-proxy-users server option
-
_default_authentication_plugin_服务器系统变量