## 1.3 MySQL 8.0 中的新功能

本节总结了 MySQL 8.0 中添加、弃用和删除的内容。配套部分列出了 MySQL 8.0 中添加、弃用或删除的 MySQL 服务器选项和变量；看[第 1.4 节，“MySQL 8.0 中添加、弃用或删除的服务器和状态变量和选项”](added-deprecated-removed.html).

-   [MySQL 8.0 中添加的功能](mysql-nutshell.html#mysql-nutshell-additions)

-   [MySQL 8.0 中已弃用的功能](mysql-nutshell.html#mysql-nutshell-deprecations)

-   [MySQL 8.0 中删除的功能](mysql-nutshell.html#mysql-nutshell-removals)

### MySQL 8.0 中添加的功能

[](<>)[](<>)

MySQL 8.0 添加了以下功能：

-   **数据字典。**MySQL 现在合并了一个事务数据字典，用于存储有关数据库对象的信息。在以前的 MySQL 版本中，字典数据存储在元数据文件和非事务表中。有关详细信息，请参阅[第 14 章，*MySQL 数据字典*](data-dictionary.html).

    [](<>)[](<>)

-   **原子数据定义语句 (Atomic DDL)。**原子 DDL 语句将与 DDL 操作关联的数据字典更新、存储引擎操作和二进制日志写入组合到单个原子事务中。有关详细信息，请参阅[第 13.1.1 节，“原子数据定义语句支持”](atomic-ddl.html).

    [](<>)[](<>)

-   **升级程序。**以前，安装新版本的MySQL后，MySQL服务器在下次启动时会自动升级数据字典表，之后DBA会调用[**mysql\_升级**](mysql-upgrade.html)手动升级系统表`mysql`模式，以及其他模式中的对象，例如`系统`架构和用户架构。

    [](<>)[](<>)

    从 MySQL 8.0.16 开始，服务器执行之前由[**mysql\_升级**](mysql-upgrade.html).安装新的 MySQL 版本后，服务器现在会在下次启动时自动执行所有必要的升级任务，并且不依赖于 DBA 调用[**mysql\_升级**](mysql-upgrade.html).此外，服务器会更新帮助表的内容（一些[**mysql\_升级**](mysql-upgrade.html)没做）。一个新的[`- 升级`](server-options.html#option_mysqld_upgrade)server 选项提供对服务器如何执行自动数据字典和服务器升级操作的控制。有关详细信息，请参阅[第 2.11.3 节，“MySQL 升级过程升级了什么”](upgrading-what-is-upgraded.html).

-   **安全和帐户管理。**添加这些增强功能是为了提高安全性并在帐户管理中实现更大的 DBA 灵活性：

    [](<>)[](<>)

    -   授予表中的`mysql`系统数据库现在`InnoDB`（事务）表。以前，这些是`MyISAM`（非事务性）表。授权表存储引擎的变化是伴随帐户管理语句行为变化的基础。以前，账户管理声明（例如[`创建用户`](create-user.html)要么[`删除用户`](drop-user.html)) 命名多个用户可能对某些用户成功而对其他用户失败。现在，每条语句都是事务性的，要么对所有命名用户都成功，要么回滚，如果发生任何错误，则无效。如果成功，该语句将写入二进制日志，但如果失败则不会；在这种情况下，会发生回滚并且不会进行任何更改。有关详细信息，请参阅[第 13.1.1 节，“原子数据定义语句支持”](atomic-ddl.html).

    -   一个新的`cache_sha2_password`身份验证插件可用。如`sha256_password`插入，`cache_sha2_password`实现 SHA-256 密码散列，但使用缓存来解决连接时的延迟问题。它还支持更多传输协议，并且不需要针对基于 RSA 密钥对的密码交换功能的 OpenSSL 链接。看[第 6.4.1.2 节，“缓存 SHA-2 可插入身份验证”](caching-sha2-pluggable-authentication.html).

        这`cache_sha2_password`和`sha256_password`身份验证插件提供比`mysql_native_password`插件，和`cache_sha2_password`提供比`sha256_password`.由于这些优越的安全性和性能特点`cache_sha2_password`，它现在是首选的身份验证插件，也是默认的身份验证插件，而不是`mysql_native_password`.有关更改默认插件对服务器操作的影响以及服务器与客户端和连接器的兼容性的信息，请参阅[缓存\_沙2\_密码作为首选身份验证插件](upgrading-from-previous-series.html#upgrade-caching-sha2-password).

    -   MySQL 企业版 SASL LDAP 身份验证插件现在支持 GSSAPI/Kerberos 作为 Linux 上 MySQL 客户端和服务器的身份验证方法。这在应用程序使用 Microsoft Active Directory（默认启用 Kerberos）访问 LDAP 的 Linux 环境中很有用。看[LDAP 身份验证方法](ldap-pluggable-authentication.html#ldap-pluggable-authentication-auth-methods).

    -   MySQL 企业版现在支持一种身份验证方法，该方法使用户能够使用 Kerberos 对 MySQL 服务器进行身份验证，前提是提供或可以获得适当的 Kerberos 票证。有关详细信息，请参阅[第 6.4.1.8 节，“Kerberos 可插入身份验证”](kerberos-pluggable-authentication.html).

    -   MySQL 现在支持角色，即特权的命名集合。可以创建和删除角色。角色可以被授予和撤销权限。可以向用户帐户授予和撤消角色。可以从授予该帐户的角色中选择帐户的活动适用角色，并且可以在该帐户的会话期间更改。有关详细信息，请参阅[第 6.2.10 节，“使用角色”](roles.html).

    -   MySQL 现在合并了用户帐户类别的概念，系统用户和普通用户根据他们是否拥有[`SYSTEM_USER`](privileges-provided.html#priv_system-user)特权。看[第 6.2.11 节，“帐户类别”](account-categories.html).

    -   以前，除了某些模式之外，无法授予全局适用的权限。这现在是可能的，如果[`部分撤销`](server-system-variables.html#sysvar_partial_revokes)系统变量已启用。看[第 6.2.12 节，“使用部分撤销的权限限制”](partial-revokes.html).

    -   这[`授予`](grant.html)声明有一个`作为 *`用户`* [有角色]`子句，指定有关用于语句执行的特权上下文的附加信息。这种语法在 SQL 级别是可见的，尽管它的主要目的是通过使这些限制出现在二进制日志中，在所有节点上实现由部分撤销施加的授予者权限限制的统一复制。看[第 13.7.1.6 节，“GRANT 声明”](grant.html).

    -   MySQL 现在维护有关密码历史记录的信息，从而限制重复使用以前的密码。DBA 可以要求在一定次数的密码更改或一段时间内不要从以前的密码中选择新密码。可以在全局以及每个帐户的基础上建立密码重用策略。

        现在可以要求通过指定要替换的当前密码来验证更改帐户密码的尝试。这使 DBA 能够防止用户在不证明他们知道当前密码的情况下更改密码。可以在全球范围内以及在每个帐户的基础上建立密码验证策略。

        现在允许帐户具有双重密码，这使得分阶段密码更改可以在复杂的多服务器系统中无缝执行，而无需停机。

        MySQL 现在允许管理员配置用户帐户，以便由于密码错误导致的太多连续登录失败导致临时帐户锁定。所需的失败次数和锁定时间可根据帐户进行配置。

        这些新功能使 DBA 可以更全面地控制密码管理。有关详细信息，请参阅[第 6.2.15 节，“密码管理”](password-management.html).

    -   MySQL 现在支持 FIPS 模式，如果使用 OpenSSL 编译，并且 OpenSSL 库和 FIPS 对象模块在运行时可用。FIPS 模式对加密操作施加条件，例如对可接受的加密算法的限制或对更长密钥长度的要求。看[第 6.8 节，“FIPS 支持”](fips-mode.html).

    -   服务器用于新连接的 TLS 上下文现在可以在运行时重新配置。此功能可能很有用，例如，避免重新启动运行时间过长以至于其 SSL 证书已过期的 MySQL 服务器。看[加密连接的服务器端运行时配置和监控](using-encrypted-connections.html#using-encrypted-connections-server-side-runtime-configuration).

    -   OpenSSL 1.1.1 支持用于加密连接的 TLS v1.3 协议，如果服务器和客户端都使用 OpenSSL 1.1.1 或更高版本编译，则 MySQL 8.0.16 及更高版本也支持 TLS v1.3。看[第 6.3.2 节，“加密连接 TLS 协议和密码”](encrypted-connection-protocols-ciphers.html).

    -   MySQL 现在将在命名管道上授予客户端的访问控制设置为在 Windows 上成功通信所需的最低限度。较新的 MySQL 客户端软件无需任何额外配置即可打开命名管道连接。如果旧的客户端软件不能立即升级，新的[`named_pipe_full_access_group`](server-system-variables.html#sysvar_named_pipe_full_access_group)系统变量可用于为 Windows 组提供打开命名管道连接所需的权限。完全访问组中的成员资格应受到限制且是临时的。

    -   以前，MySQL 用户帐户使用单一身份验证方法向服务器进行身份验证。从 MySQL 8.0.27 开始，MySQL 支持多因素身份验证 (MFA)，这使得创建最多具有三种身份验证方法的帐户成为可能。MFA 支持需要进行以下更改：

        -   [`创建用户`](create-user.html)和[`更改用户`](alter-user.html)语法已扩展为允许指定多种身份验证方法。

        -   这[`身份验证策略`](server-system-variables.html#sysvar_authentication_policy)系统变量允许通过控制可以使用的因素数量以及每个因素允许的身份验证类型来建立 MFA 策略。这限制了与认证相关的条款如何[`创建用户`](create-user.html)和[`更改用户`](alter-user.html)可以使用语句。

        -   客户程序有新的[`--密码1`](connection-options.html#option_general_password1),[`--密码2`](connection-options.html#option_general_password2)， 和[`--密码3`](connection-options.html#option_general_password3)用于指定多个密码的命令行选项。对于使用 C API 的应用程序，新的`MYSQL_OPT_USER_PASSWORD`选项[`mysql_options4()`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-options4.html)C API 函数启用相同的功能。

            此外，MySQL 企业版现在支持使用智能卡、安全密钥和生物识别阅读器等设备对 MySQL 服务器进行身份验证。这种身份验证方法基于快速身份在线 (FIDO) 标准，并使用一对插件，`身份验证_fido`在服务器端和`authentication_fido_client`在客户端。服务器端 FIDO 身份验证插件仅包含在 MySQL Enterprise Edition 发行版中。它不包含在 MySQL 社区发行版中。但是，客户端插件包含在所有发行版中，包括社区发行版。这使来自任何发行版的客户端都可以连接到加载了服务器端插件的服务器。

            多因素身份验证可以使用现有的 MySQL 身份验证方法、新的 FIDO 身份验证方法或两者的组合。有关详细信息，请参阅[第 6.2.18 节，“多因素身份验证”](multifactor-authentication.html)， 和[第 6.4.1.11 节，“FIDO 可插入身份验证”](fido-pluggable-authentication.html).

-   **资源管理。**MySQL 现在支持资源组的创建和管理，并允许将服务器内运行的线程分配给特定组，以便线程根据组可用的资源执行。组属性启用对其资源的控制，以启用或限制组中线程的资源消耗。DBA 可以根据不同的工作负载修改这些属性。目前，CPU时间是一种可管理的资源，以“虚拟CPU”的概念表示，包括CPU内核、超线程、硬件线程等。服务器在启动时确定有多少虚拟 CPU 可用，具有适当权限的数据库管理员可以将这些 CPU 与资源组相关联并将线程分配给组。有关详细信息，请参阅[第 5.1.16 节，“资源组”](resource-groups.html).

    [](<>)[](<>)

-   **表加密管理。**现在可以通过定义和强制加密默认值来全局管理表加密。这[`default_table_encryption`](server-system-variables.html#sysvar_default_table_encryption)变量为新创建的模式和通用表空间定义了加密默认值。模式的加密默认值也可以使用`默认加密`创建模式时的子句。默认情况下，表继承了创建它的模式或通用表空间的加密。加密默认值是通过启用[`table_encryption_privilege_check`](server-system-variables.html#sysvar_table_encryption_privilege_check)多变的。权限检查发生在创建或更改具有不同于[`default_table_encryption`](server-system-variables.html#sysvar_default_table_encryption)设置，或者在使用不同于默认模式加密的加密设置创建或更改表时。这[`TABLE_ENCRYPTION_ADMIN`](privileges-provided.html#priv_table-encryption-admin)权限允许在以下情况下覆盖默认加密设置[`table_encryption_privilege_check`](server-system-variables.html#sysvar_table_encryption_privilege_check)已启用。有关详细信息，请参阅[为模式和通用表空间定义加密默认值](innodb-data-encryption.html#innodb-schema-tablespace-encryption-default).

    [](<>)[](<>)

-   **InnoDB 增强功能。**这些`InnoDB`添加了增强功能：

    [](<>)[](<>)

    -   每次值更改时，当前最大自动增量计数器值都会写入重做日志，并在每个检查点保存到引擎专用系统表中。这些更改使当前最大的自动增量计数器值在服务器重新启动时保持不变。此外：

        -   服务器重启不再取消`AUTO_INCREMENT = N`表选项。如果将自动增量计数器初始化为特定值，或者将自动增量计数器值更改为更大的值，则新值会在服务器重新启动时保持不变。

        -   服务器立即重启[`回滚`](commit.html)操作不再导致重用分配给回​​滚事务的自动增量值。

        -   如果你修改一个`自动递增`将列值设置为大于当前最大自动增量值的值（在[`更新`](update.html)操作，例如），新值被持久化，随后[`插入`](insert.html)操作从新的更大的值开始分配自动增量值。

            有关详细信息，请参阅[第 15.6.1.6 节，“自动\_InnoDB 中的增量处理”](innodb-auto-increment-handling.html)， 和[InnoDB 自动\_INCREMENT 计数器初始化](innodb-auto-increment-handling.html#innodb-auto-increment-initialization).

    -   当遇到索引树损坏时，`InnoDB`将损坏标志写入重做日志，使损坏标志崩溃安全。`InnoDB`还将内存中的损坏标志数据写入每个检查点上的引擎专用系统表。康复期间，`InnoDB`在将内存表和索引对象标记为损坏之前，从两个位置读取损坏标志并合并结果。

    -   这`InnoDB` **内存缓存**插件支持多个`得到`操作（一次获取多个键值对**内存缓存**查询）和范围查询。看[第 15.20.4 节，“InnoDB memcached 多获取和范围查询支持”](innodb-memcached-multiple-get-range-query.html).

    -   一个新的动态变量，[`innodb_deadlock_detect`](innodb-parameters.html#sysvar_innodb_deadlock_detect), 可用于禁用死锁检测。在高并发系统上，当多个线程等待同一个锁时，死锁检测会导致速度变慢。有时，禁用死锁检测并依赖[`innodb_lock_wait_timeout`](innodb-parameters.html#sysvar_innodb_lock_wait_timeout)发生死锁时事务回滚的设置。

        [](<>)[](<>)

    -   新的[`INFORMATION_SCHEMA.INNODB_CACHED_INDEXES`](information-schema-innodb-cached-indexes-table.html)表报告缓存在`InnoDB`每个索引的缓冲池。

    -   `InnoDB`现在在共享临时表空间中创建临时表，`ibtmp1`.

    -   这`InnoDB` [表空间加密功能](innodb-data-encryption.html)支持redo log和undo log数据的加密。看[重做日志加密](innodb-data-encryption.html#innodb-data-encryption-redo-log)， 和[撤消日志加密](innodb-data-encryption.html#innodb-data-encryption-undo-log).

    -   `InnoDB`支持`现在等待`和`跳过锁定`选项`选择...分享`和`选择 ... 更新`锁定读取语句。`现在等待`如果请求的行被另一个事务锁定，则使语句立即返回。`跳过锁定`从结果集中删除锁定的行。看[使用 NOWAIT 和 SKIP LOCKED 锁定读取并发](innodb-locking-reads.html#innodb-locking-reads-nowait-skip-locked).

        `选择...分享`替换`选择 ... 锁定共享模式`， 但`锁定分享模式`仍然可用于向后兼容。语句是等价的。然而，`更新`和`分享`支持`现在等待`,`跳过锁定`， 和`的 *`tbl_name`*`选项。看[第 13.2.10 节，“SELECT 语句”](select.html).

        `的 *`tbl_name`*`将锁定查询应用于命名表。

    -   `添加分区`,`删除分区`,`合并分区`,`重组分区`， 和`重建分区` [`更改表`](alter-table.html)选项由本地分区就地 API 支持，并且可以与`算法={复制|插入}`和`锁`条款。

        `删除分区`和`算法=就地`删除存储在分区中的数据并删除分区。然而，`删除分区`和`算法=复制`要么[`old_alter_table=开启`](server-system-variables.html#sysvar_old_alter_table)重建分区表并尝试将数据从删除的分区移动到另一个具有兼容的分区`分区...值`定义。无法移动到另一个分区的数据将被删除。

    -   这`InnoDB`存储引擎现在使用 MySQL 数据字典而不是它自己的存储引擎特定的数据字典。有关数据字典的信息，请参阅[第 14 章，*MySQL 数据字典*](data-dictionary.html).

    -   `mysql`系统表和数据字典表现在在一个单一的创建`InnoDB`表空间文件名为`mysql.ibd`在 MySQL 数据目录中。以前，这些表是单独创建的`InnoDB`表空间文件在`mysql`数据库目录。

    -   MySQL 8.0 中引入了以下撤消表空间更改：

        -   默认情况下，撤消日志现在驻留在初始化 MySQL 实例时创建的两个撤消表空间中。撤消日志不再在系统表空间中创建。

        -   从 MySQL 8.0.14 开始，可以在运行时在选定位置创建额外的撤消表空间，使用[`创建撤销表空间`](create-tablespace.html)句法。

            ```
            CREATE UNDO TABLESPACE tablespace_name ADD DATAFILE 'file_name.ibu';
            ```

            撤消使用创建的表空间[`创建撤销表空间`](create-tablespace.html)语法可以在运行时使用[`删除撤销表空间`](drop-tablespace.html)句法。

            ```
            DROP UNDO TABLESPACE tablespace_name;
            ```

            [`更改撤消表空间`](alter-tablespace.html)语法可用于将撤消表空间标记为活动或非活动。

            ```
            ALTER UNDO TABLESPACE tablespace_name SET {ACTIVE|INACTIVE};
            ```

            一种`状态`显示表空间状态的列已添加到[`INFORMATION_SCHEMA.INNODB_TABLESPACES`](information-schema-innodb-tablespaces-table.html)桌子。撤消表空间必须位于`空的`在它可以被删除之前的状态。

        -   这[`innodb_undo_log_truncate`](innodb-parameters.html#sysvar_innodb_undo_log_truncate)默认情况下启用变量。

        -   这[`innodb_rollback_segments`](innodb-parameters.html#sysvar_innodb_rollback_segments)变量定义每个撤消表空间的回滚段数。之前，[`innodb_rollback_segments`](innodb-parameters.html#sysvar_innodb_rollback_segments)指定 MySQL 实例的回滚段总数。此更改增加了可用于并发事务的回滚段的数量。更多的回滚段增加了并发事务为撤消日志使用单独的回滚段的可能性，从而减少了资源争用。

    -   修改了影响缓冲池预刷新和刷新行为的变量的默认值：

        -   这[`innodb_max_dirty_pages_pct_lwm`](innodb-parameters.html#sysvar_innodb_max_dirty_pages_pct_lwm)现在默认值为 10。之前的默认值 0 禁用缓冲池预刷新。当缓冲池中脏页的百分比超过 10% 时，值 10 启用预刷新。启用预刷新可提高性能一致性。这

        -   innodb_max_dirty_pages_pct[`默认值从 75 增加到 90。`](innodb-parameters.html#sysvar_innodb_max_dirty_pages_pct)InnoDB`尝试从缓冲池中刷新数据，以使脏页的百分比不超过此值。`增加的默认值允许缓冲池中有更大百分比的脏页。默认

    -   innodb_autoinc_lock_mode[`设置现在为 2（交错）。`](innodb-parameters.html#sysvar_innodb_autoinc_lock_mode)交错锁模式允许并行执行多行插入，从而提高了并发性和可伸缩性。新的innodb_autoinc_lock_mode[`默认设置反映了从基于语句的复制到基于行的复制作为 MySQL 5.7 中默认复制类型的变化。`](innodb-parameters.html#sysvar_innodb_autoinc_lock_mode)基于语句的复制需要连续的自动增量锁定模式（以前​​的默认值），以确保为给定的 SQL 语句序列以可预测和可重复的顺序分配自动增量值，而基于行的复制对SQL 语句的执行顺序。有关详细信息，请参阅[InnoDB 自动\_增量锁定模式](innodb-auto-increment-handling.html#innodb-auto-increment-lock-modes).

        对于使用基于语句的复制的系统，新的[`innodb_autoinc_lock_mode`](innodb-parameters.html#sysvar_innodb_autoinc_lock_mode)默认设置可能会破坏依赖于顺序自动增量值的应用程序。要恢复以前的默认值，请设置[`innodb_autoinc_lock_mode`](innodb-parameters.html#sysvar_innodb_autoinc_lock_mode)为 1。

    -   支持重命名通用表空间[`ALTER TABLESPACE ...重命名为`](alter-tablespace.html)句法。

    -   新的[`innodb_dedicated_server`](innodb-parameters.html#sysvar_innodb_dedicated_server)默认情况下禁用的变量可用于`InnoDB`根据服务器上检测到的内存量自动配置以下选项：

        -   [`innodb_buffer_pool_size`](innodb-parameters.html#sysvar_innodb_buffer_pool_size)

        -   [`innodb_log_file_size`](innodb-parameters.html#sysvar_innodb_log_file_size)

        -   [`innodb_flush_method`](innodb-parameters.html#sysvar_innodb_flush_method)

            此选项适用于在专用服务器上运行的 MySQL 服务器实例。有关详细信息，请参阅[第 15.8.12 节，“为专用 MySQL 服务器启用自动配置”](innodb-dedicated-server.html).

    -   新的[`INFORMATION_SCHEMA.INNODB_TABLESPACES_BRIEF`](information-schema-innodb-tablespaces-brief-table.html)视图提供空间、名称、路径、标志和空间类型数据`InnoDB`表空间。

    -   这[zlib 库](http://www.zlib.net/)与 MySQL 捆绑的版本从版本 1.2.3 提升到版本 1.2.11。MySQL 在 zlib 库的帮助下实现压缩。

        如果你使用`InnoDB`压缩表，见[第 2.11.4 节，“MySQL 8.0 中的更改”](upgrading-from-previous-series.html)对于相关的升级影响。

    -   序列化字典信息 (SDI) 存在于所有`InnoDB`除了全局临时表空间和撤消表空间文件之外的表空间文件。SDI 是表和表空间对象的序列化元数据。SDI 数据的存在提供了元数据冗余。例如，如果数据字典变得不可用，则可以从表空间文件中提取字典对象元数据。SDI 提取是使用[**ibd2sdi**](ibd2sdi.html)工具。SDI 数据存储在`JSON`格式。

        在表空间文件中包含 SDI 数据会增加表空间文件的大小。SDI 记录需要一个索引页，默认大小为 16KB。但是，SDI 数据在存储时会被压缩以减少存储空间。

    -   这`InnoDB`存储引擎现在支持原子 DDL，它确保 DDL 操作要么完全提交要么回滚，即使服务器在操作期间停止。有关详细信息，请参阅[第 13.1.1 节，“原子数据定义语句支持”](atomic-ddl.html).

    -   当服务器离线时，可以使用[`innodb_directories`](innodb-parameters.html#sysvar_innodb_directories)选项。有关详细信息，请参阅[第 15.6.3.6 节，“在服务器脱机时移动表空间文件”](innodb-moving-data-files-offline.html).

    -   实施了以下重做日志优化：

        -   用户线程现在可以在不同步写入的情况下并发写入日志缓冲区。

        -   用户线程现在可以以宽松的顺序将脏页添加到刷新列表中。

        -   一个专用的日志线程现在负责将日志缓冲区写入系统缓冲区、将系统缓冲区刷新到磁盘、通知用户线程有关写入和刷新的重做、维护宽松刷新列表顺序所需的延迟以及写入检查点。

        -   添加了系统变量，用于配置等待刷新重做的用户线程使用自旋延迟：

            -   [`innodb_log_wait_for_flush_spin_hwm`](innodb-parameters.html#sysvar_innodb_log_wait_for_flush_spin_hwm)：定义最大平均日志刷新时间，超过该时间用户线程在等待刷新重做时不再旋转。

            -   [`innodb_log_spin_cpu_abs_lwm`](innodb-parameters.html#sysvar_innodb_log_spin_cpu_abs_lwm): 定义用户线程在等待刷新重做时不再旋转的最小 CPU 使用量。

            -   [`innodb_log_spin_cpu_pct_hwm`](innodb-parameters.html#sysvar_innodb_log_spin_cpu_pct_hwm)：定义用户线程在等待刷新重做时不再旋转的最大 CPU 使用量。

        -   这[`innodb_log_buffer_size`](innodb-parameters.html#sysvar_innodb_log_buffer_size)变量现在是动态的，它允许在服务器运行时调整日志缓冲区的大小。

            有关详细信息，请参阅[第 8.5.4 节，“优化 InnoDB 重做日志”](optimizing-innodb-logging.html).

    -   从 MySQL 8.0.12 开始，对大对象 (LOB) 数据的小更新支持撤消日志记录，这提高了 100 字节或更小的 LOB 更新的性能。以前，LOB 更新的大小至少为一个 LOB 页，这对于可能只修改几个字节的更新来说不是最佳的。此增强功能基于 MySQL 8.0.4 中添加的对 LOB 数据的部分更新的支持。

    -   从 MySQL 8.0.12 开始，`算法=即时`支持以下[`更改表`](alter-table.html)操作：

        -   添加一列。此功能也称为“即时`添加列`”。限制适用。看[第 15.12.1 节，“在线 DDL 操作”](innodb-online-ddl-operations.html).

        -   添加或删除虚拟列。

        -   添加或删除列默认值。

        -   修改定义[`枚举`](enum.html)要么[`放`](set.html)柱子。

        -   更改索引类型。

        -   重命名表。

            支持的操作`算法=即时`只修改数据字典中的元数据。表上没有元数据锁，表数据不受影响，操作是即时的。如果没有明确指定，`算法=即时`默认情况下由支持它的操作使用。如果`算法=即时`已指定但不受支持，则操作会立即失败并出现错误。

            有关支持的操作的更多信息`算法=即时`， 看[第 15.12.1 节，“在线 DDL 操作”](innodb-online-ddl-operations.html).

    -   从 MySQL 8.0.13 开始，`临时表`存储引擎支持存储二进制大对象 (BLOB) 类型的列。此增强功能提高了使用包含 BLOB 数据的临时表的查询的性能。以前，包含 BLOB 数据的临时表存储在由定义的磁盘存储引擎中[`internal_tmp_disk_storage_engine`](server-system-variables.html#sysvar_internal_tmp_disk_storage_engine).有关详细信息，请参阅[第 8.4.4 节，“MySQL 中的内部临时表使用”](internal-temporary-tables.html).

    -   从 MySQL 8.0.13 开始，`InnoDB`静态数据加密功能支持通用表空间。以前，只能加密 file-per-table 表空间。为了支持通用表空间的加密，[`创建表空间`](create-tablespace.html)和[`改变表空间`](alter-tablespace.html)语法被扩展为包括`加密`条款。

        这[`INFORMATION_SCHEMA.INNODB_TABLESPACES`](information-schema-innodb-tablespaces-table.html)表现在包括一个`加密`指示表空间是否加密的列。

        这`stage/innodb/alter 表空间（加密）`添加了性能模式阶段工具以允许监视一般表空间加密操作。

    -   禁用`innodb_buffer_pool_in_core_file`变量通过排除减少核心文件的大小`InnoDB`缓冲池页面。要使用这个变量，[`核心文件`](server-system-variables.html#sysvar_core_file)变量必须启用并且操作系统必须支持`MADV_DONTDUMP`非 POSIX 扩展至`疯狂的（）`，在 Linux 3.4 及更高版本中受支持。有关详细信息，请参阅[第 15.8.3.7 节，“从核心文件中排除缓冲池页面”](innodb-buffer-pool-in-core-file.html).

    -   从 MySQL 8.0.13 开始，用户创建的临时表和优化器创建的内部临时表存储在会话临时表空间中，这些临时表空间从临时表空间池中分配给会话。当会话断开连接时，其临时表空间将被截断并释放回池中。在以前的版本中，临时表是在全局临时表空间 (`ibtmp1`)，在删除临时表后没有将磁盘空间返回给操作系统。

        这[`innodb_temp_tablespaces_dir`](innodb-parameters.html#sysvar_innodb_temp_tablespaces_dir)变量定义创建会话临时表空间的位置。默认位置是`#innodb_temp`数据目录中的目录。

        这[`INNODB_SESSION_TEMP_TABLESPACES`](information-schema-innodb-session-temp-tablespaces-table.html)table 提供有关会话临时表空间的元数据。

        全局临时表空间 (`ibtmp1`) 现在存储对用户创建的临时表所做的更改的回滚段。

    -   从 MySQL 8.0.14 开始，`InnoDB`支持并行聚集索引读取，可以提高[`检查表`](check-table.html)表现。此功能不适用于二级索引扫描。这[`innodb_parallel_read_threads`](innodb-parameters.html#sysvar_innodb_parallel_read_threads)会话变量必须设置为大于1的值，才能进行并行聚集索引读取。默认值为4。用于执行并行聚集索引读取的实际线程数由[`innodb_并行_读取_线程`](innodb-parameters.html#sysvar_innodb_parallel_read_threads)设置或要扫描的索引子树数，以较小者为准。

    -   从2014年8月0日起[`innodb_专用_服务器`](innodb-parameters.html#sysvar_innodb_dedicated_server)变量，则根据自动配置的缓冲池大小配置日志文件的大小和数量。以前，日志文件大小是根据服务器上检测到的内存量配置的，日志文件的数量不是自动配置的。

    -   截至2014年8月0日`添加数据文件`合同条款[`创建表空间`](create-tablespace.html)语句是可选的，它允许用户不使用[`文件`](privileges-provided.html#priv_file)创建表空间的特权。A.[`创建表空间`](create-tablespace.html)语句执行时没有`添加数据文件`子句隐式创建具有唯一文件名的表空间数据文件。

    -   默认情况下，当可诱惑存储引擎占用的内存量超过[`诱人的_max_ram`](server-system-variables.html#sysvar_temptable_max_ram)变量时，诱人的存储引擎开始从磁盘分配内存映射的临时文件。从MySQL 8.0.16开始，这种行为由[`诱人的_使用_mmap`](server-system-variables.html#sysvar_temptable_use_mmap)变量禁用[`诱人的_使用_mmap`](server-system-variables.html#sysvar_temptable_use_mmap)使诱人的存储引擎使用`InnoDB`磁盘上的内部临时表，而不是内存映射文件作为其溢出机制。有关更多信息，请参阅[内部临时表存储引擎](internal-temporary-tables.html#internal-temporary-tables-engines).

    -   从MySQL 8.0.16开始`InnoDB`静态数据加密功能支持对`mysql`系统表空间。这个`mysql`系统表空间包含`mysql`系统数据库和MySQL数据字典表。有关更多信息，请参阅[第15.13节，“InnoDB静态数据加密”](innodb-data-encryption.html).

    -   这个[`innodb\u旋转\u等待\u暂停\u倍增`](innodb-parameters.html#sysvar_innodb_spin_wait_pause_multiplier)MySQL 8.0.16中引入的变量可以更好地控制线程等待获取互斥锁或rw锁时发生的自旋锁轮询延迟的持续时间。延迟可以进行更精细的调整，以考虑不同处理器架构上暂停指令持续时间的差异。有关更多信息，请参阅[第15.8.8节，“配置旋转锁轮询”](innodb-performance-spin_lock_polling.html).

    -   `InnoDB`在MySQL 8.0.17中，通过更好地利用读取线程、减少并行扫描期间发生的预取活动的读取线程I/O，以及支持分区的并行扫描，大型数据集的并行读取线程性能得到了提高。

        并行读取线程功能由[`innodb_并行_读取_线程`](innodb-parameters.html#sysvar_innodb_parallel_read_threads)变量最大设置现在是256，这是所有客户端连接的线程总数。如果达到线程限制，连接将退回到使用单个线程。

    -   这个[`innodb_空闲_刷新_pct`](innodb-parameters.html#sysvar_innodb_idle_flush_pct)MySQL 8.0.18中引入的变量允许在空闲期间限制页面刷新，这有助于延长固态存储设备的使用寿命。看见[在空闲期间限制缓冲区刷新](innodb-buffer-pool-flushing.html#innodb-limit-flushing-rate).

    -   有效采样`InnoDB`MySQL 8.0.19支持用于生成直方图统计的数据。看见[直方图统计分析](analyze-table.html#analyze-table-histogram-statistics-analysis).

    -   从MySQL 8.0.20开始，doublewrite缓冲区存储区域位于doublewrite文件中。在以前的版本中，存储区域位于系统表空间中。将存储区域移出系统表空间可以减少写入延迟，提高吞吐量，并在放置双写缓冲页方面提供灵活性。为高级双写缓冲区配置引入了以下系统变量：

        -   [`innodb_doublewrite_dir`](innodb-parameters.html#sysvar_innodb_doublewrite_dir)

            定义双写缓冲区文件目录。

        -   [`innodb_doublewrite_文件`](innodb-parameters.html#sysvar_innodb_doublewrite_files)

            定义doublewrite文件的数量。

        -   [`innodb_doublewrite_页面`](innodb-parameters.html#sysvar_innodb_doublewrite_pages)

            定义批量写入的每个线程的最大doublewrite页数。

        -   [`innodb_双写_批量_大小`](innodb-parameters.html#sysvar_innodb_doublewrite_batch_size)

            定义批量写入的doublewrite页数。

            有关更多信息，请参阅[第15.6.4节，“双写缓冲区”](innodb-doublewrite-buffer.html).

    -   MySQL 8.0.20中改进了竞争感知事务调度（CAT）算法，该算法对等待锁定的事务进行优先级排序。事务调度权重计算现在完全由单独的线程执行，这提高了计算性能和准确性。

        先进先出（FIFO）算法也被用于事务调度，该算法被删除。FIFO算法通过对CATS算法的增强而变得多余。以前由FIFO算法执行的事务调度现在由CATS算法执行。

        A.`TRX_时间表_重量`列被添加到`信息模式。INNODB_TRX`表，它允许查询由CATS算法分配的事务调度权重。

        下面`INNODB_度量`为监视代码级事务调度事件添加了计数器：

        -   `锁定恢复释放尝试`

            尝试释放记录锁的次数。

        -   `锁定记录授予尝试`

            尝试授予记录锁的次数。

        -   `锁定\u时间表\u刷新`

            分析等待图以更新事务调度权重的次数。

            有关更多信息，请参阅[第15.7.6节“事务调度”](innodb-transaction-scheduling.html).

    -   从MySQL 8.0.21开始，为了提高需要访问表和行资源的锁队列的操作的并发性，锁系统互斥锁(`锁定系统->互斥`)在中被碎片锁取代，锁队列被分组到表和页中*锁定队列碎片*，每个碎片由专用互斥锁保护。以前，单锁系统互斥体保护所有锁队列，这是高并发系统上的一个争用点。新的分片实现允许对锁队列进行更细粒度的访问。

        锁系统互斥锁(`锁定系统->互斥`)替换为以下分片闩锁：

        -   全球闩锁(`锁定系统->闩锁。全局锁定`)由64个读写锁对象组成(`rw_lock_t`).访问单个锁队列需要共享全局闩锁和锁队列碎片上的闩锁。需要访问所有锁队列的操作采用独占全局锁存器，该锁存器锁存所有表和页锁队列碎片。

        -   桌子碎片闩锁(`锁定系统->闩锁。桌子碎片。互斥器`)，实现为512个互斥体的数组，每个互斥体专用于512个表锁队列碎片中的一个。

        -   页碎片闩锁(`锁定系统->闩锁。页面碎片。互斥器`)，实现为512个互斥体的数组，每个互斥体专用于512个页面锁队列碎片中的一个。

            性能模式`wait/synch/mutex/innodb/lock_mutex`用于监控单锁系统互斥锁的仪器已被用于监控新的全局、表碎片和页面碎片闩锁的仪器所取代：

        -   `wait/synch/sxlock/innodb/lock_sys_global_rw_lock`

        -   `wait/synch/mutex/innodb/lock_sys_table_mutex`

        -   `wait/synch/mutex/innodb/lock_sys_page_mutex`

    -   从MySQL 8.0.21开始，使用`数据目录`子句仅限于已知的目录`InnoDB`。此更改允许数据库管理员控制表空间数据文件的创建位置，并确保在恢复期间可以找到这些数据文件。

        常规和每表文件表空间数据文件(`.传染性法氏囊病`无法再在撤消表空间目录中创建文件）([`innodb_undo_目录`](innodb-parameters.html#sysvar_innodb_undo_directory))除非大家都知道`InnoDB`.

        已知目录是由[`数据目录`](server-system-variables.html#sysvar_datadir), [`innodb_数据_主页_目录`](innodb-parameters.html#sysvar_innodb_data_home_dir)和[`innodb_目录`](innodb-parameters.html#sysvar_innodb_directories)变量。

        截断`InnoDB`驻留在每个表表空间的文件中的表会删除现有表空间并创建一个新表空间。从MySQL 8.0.21开始，`InnoDB`在默认位置创建新表空间，并在当前表空间目录未知时向错误日志写入警告。拥有[`截断表`](truncate-table.html)在当前位置创建表空间，将目录添加到[`innodb_目录`](innodb-parameters.html#sysvar_innodb_directories)运行前设置[`截断表`](truncate-table.html).

    -   从MySQL 8.0.21开始，可以使用[`ALTER实例{ENABLE | DISABLE}INNODB REDO_LOG`](alter-instance.html)语法。此功能用于将数据加载到新的MySQL实例中。禁用重做日志有助于避免重做日志写入，从而加快数据加载速度。

        新的[`INNODB_重做_日志_启用`](privileges-provided.html#priv_innodb-redo-log-enable)特权允许启用和禁用重做日志记录。

        新的[`Innodb_重做_日志_已启用`](server-status-variables.html#statvar_Innodb_redo_log_enabled)状态变量允许监视重做日志记录状态。

        看见[禁用重做日志记录](innodb-redo-log.html#innodb-disable-redo-logging).

    -   创业时，`InnoDB`如果表空间文件已移动到其他位置，则根据数据字典中存储的表空间文件路径验证已知表空间文件的路径。新的[`innodb_验证_表空间_路径`](innodb-parameters.html#sysvar_innodb_validate_tablespace_paths)MySQL 8.0.21中引入的变量允许禁用表空间路径验证。此功能适用于不移动表空间文件的环境。禁用表空间路径验证可以缩短具有大量表空间文件的系统的启动时间。

        有关更多信息，请参阅[第15.6.3.7节，“禁用表空间路径验证”](innodb-disabling-tablespace-path-validation.html).

    -   从MySQL 8.0.21开始，在支持原子DDL的存储引擎上[`创建表格。。。选择`](create-table-select.html)当使用基于行的复制时，语句作为一个事务记录在二进制日志中。以前，它被记录为两个事务，一个用于创建表，另一个用于插入数据。有了这个变化，[`创建表格。。。选择`](create-table-select.html)语句现在对于基于行的复制是安全的，并且允许与基于GTID的复制一起使用。有关更多信息，请参阅[第13.1.1节，“原子数据定义语句支持”](atomic-ddl.html).

    -   在繁忙系统上截断撤消表空间可能会影响性能，因为相关的刷新操作会从缓冲池中删除旧的撤消表空间页，并将新撤消表空间的初始页刷新到磁盘。为了解决这个问题，从MySQL 8.0.21开始删除刷新操作。

        旧的undo表空间页面在最近使用最少时被被动释放，或者在下一个完整检查点被删除。新undo表空间的初始页面现在被重做日志记录，而不是在truncate操作期间刷新到磁盘，这也提高了undo表空间truncate操作的持久性。

        为了防止由于撤消表空间截断操作过多而导致的潜在问题，检查点之间相同撤消表空间上的截断操作现在限制为64个。如果超过该限制，撤消表空间仍然可以处于非活动状态，但直到下一个检查点之后才会被截断。

        [`INNODB_度量`](information-schema-innodb-metrics-table.html)已删除与已失效的撤消截断刷新操作关联的计数器。移除的计数器包括：`撤消\u截断\u扫描\u计数`, `撤消_截断_扫描_使用`, `撤消\u截断\u刷新\u计数`和`撤消\u截断\u刷新\u使用`.

        看见[第15.6.3.4节，“撤消表空间”](innodb-undo-tablespaces.html).

    -   从MySQL 8.0.22开始，新的[`innodb_扩展_和_初始化`](innodb-parameters.html#sysvar_innodb_extend_and_initialize)变量允许如何配置`InnoDB`在Linux上为每个表和常规表空间分配文件空间。默认情况下，当操作需要表空间中的额外空间时，`InnoDB`将页分配给表空间，并将空值物理写入这些页。如果频繁分配新页面，此行为会影响性能。你可以禁用[`innodb_扩展_和_初始化`](innodb-parameters.html#sysvar_innodb_extend_and_initialize)在Linux系统上，避免向新分配的表空间页物理写入null。什么时候[`innodb_扩展_和_初始化`](innodb-parameters.html#sysvar_innodb_extend_and_initialize)已禁用，则使用`posix_fallocate（）`调用，它在不实际写入空值的情况下保留空间。

        A.`posix_fallocate（）`操作不是原子的，这使得在为表空间文件分配空间和更新文件元数据之间可能发生故障。这种故障会使新分配的页面处于未初始化状态，从而导致在`InnoDB`试图访问这些页面。为了防止这种情况发生，`InnoDB`在分配新表空间页之前写入重做日志记录。如果页面分配操作被中断，则在恢复期间将从重做日志记录中重播该操作。

    -   从MySQL 8.0.23开始，`InnoDB`支持对属于加密表空间的doublewrite文件页进行加密。使用相关表空间的加密密钥对页面进行加密。有关更多信息，请参阅[第15.13节，“InnoDB静态数据加密”](innodb-data-encryption.html).

    -   这个[`诱人的_max_mmap`](server-system-variables.html#sysvar_temptable_max_mmap)MySQL 8.0.23中引入的变量定义了在开始在磁盘上存储内部临时表数据之前，可诱惑存储引擎允许从内存映射（MMAP）文件分配的最大内存量。设置为0将禁用MMAP文件的分配。有关更多信息，请参阅[第8.4.4节，“MySQL中的内部临时表使用”](internal-temporary-tables.html).

    -   这个`自动扩展大小`选项在MySQL 8.0.23中引入，定义了`InnoDB`当表空间满时扩展表空间的大小，从而可以以更大的增量扩展表空间大小。这个`自动扩展大小`选项受[`创建表格`](create-table.html), [`改变桌子`](alter-table.html), [`创建表空间`](create-tablespace.html)和[`改变表空间`](alter-tablespace.html)声明。有关更多信息，请参阅[第15.6.3.9节，“表空间自动扩展”\_“尺寸配置”](innodb-tablespace-autoextend-size.html).

        一`自动扩展大小`大小列已添加到[`信息模式。INNODB_表空间`](information-schema-innodb-tablespaces-table.html)桌子

    -   这个[`innodb_段_保留系数_`](innodb-parameters.html#sysvar_innodb_segment_reserve_factor)MySQL 8.0.26中引入的系统变量允许配置保留为空页的表空间文件段页的百分比。有关更多信息，请参阅[配置保留文件段页面的百分比](innodb-file-space.html#innodb-config-reserved-file-segment-pages).

    -   在支持`fdatasync（）`系统调用[`innodb_使用_fdatasync`](innodb-parameters.html#sysvar_innodb_use_fdatasync)MySQL 8.0.26中引入的变量允许使用`fdatasync（）`而不是`fsync（）`用于操作系统刷新。一`fdatasync（）`除非后续数据检索需要，否则系统调用不会刷新对文件元数据的更改，从而提供潜在的性能优势。

    -   从MySQL 8.0.28开始[`tmp_表_尺寸`](server-system-variables.html#sysvar_tmp_table_size)变量定义由可诱惑存储引擎创建的任何单个内存内部临时表的最大大小。适当的大小限制可以防止单个查询消耗过多的全局资源。看见[内部临时表存储引擎](internal-temporary-tables.html#internal-temporary-tables-engines).

    -   在MySQL 8.0.28中[`innodb_打开_文件`](innodb-parameters.html#sysvar_innodb_open_files)变量，它定义了文件的数量`InnoDB`可以一次打开，可以在运行时使用`选择innodb\u设置\u打开\u文件\u限制(*`N`*)`陈述该语句执行设置新限制的存储过程。

        防止非LRU管理的文件占用整个[`innodb_打开_文件`](innodb-parameters.html#sysvar_innodb_open_files)限制，非LRU管理的文件限制为[`innodb_打开_文件`](innodb-parameters.html#sysvar_innodb_open_files)限制，即保留10%的[`innodb_打开_文件`](innodb-parameters.html#sysvar_innodb_open_files)限制LRU管理的文件。

        这个[`innodb_打开_文件`](innodb-parameters.html#sysvar_innodb_open_files)limit包括临时表空间文件，这些文件以前未计入限制。

    -   从MySQL 8.0.28开始，`InnoDB`支持[`改变桌子。。。重命名列`](alter-table.html)使用`算法=即时`.

        支持`算法=即时`仅修改数据字典中的元数据。在操作的准备和执行阶段，表上没有独占的元数据锁，并且表数据不受影响，这使得操作是即时的。如果没有明确规定，`算法=即时`默认情况下由支持它的DDL操作使用。

        有关此操作和其他支持的DDL操作的更多信息`算法=即时`看见[第15.12.1节，“在线DDL操作”](innodb-online-ddl-operations.html).

-   **字符集支持。**默认字符集已从`拉丁语1`到`utf8mb4`这个`utf8mb4`字符集有几个新的排序规则，包括`utf8mb4_ja_0900_as_cs`，这是MySQL中第一个针对Unicode的日语特定排序规则。有关更多信息，请参阅[第10.10.1节，“Unicode字符集”](charset-unicode-sets.html).

    [](<>)[](<>)

-   **JSON增强。**对MySQL的JSON功能进行了以下增强或添加：

    [](<>)[](<>)

    -   补充道[`->>`](json-search-functions.html#operator_json-inline-path)（内联路径）运算符，相当于调用[`JSON_UNQUOTE（）`](json-modification-functions.html#function_json-unquote)关于[`JSON_EXTRACT（）`](json-search-functions.html#function_json-extract).

        这是对列路径操作符的改进[`->`](json-search-functions.html#operator_json-column-path)在MySQL 5.7中引入；`col->>“$.path”`相当于`JSON_UNQUOTE（col->“$.path”）`。内联路径运算符可以在任何可以使用的地方使用`JSON_UNQUOTE（JSON_EXTRACT（））`这样的[`选择`](select.html)列列表，`哪里`和`有`条款，以及`订购人`和`分组`条款。有关更多信息，请参阅操作员的说明，以及[JSON路径语法](json.html#json-path-syntax).

    -   添加了两个JSON聚合函数[`JSON_ARRAYAGG（）`](aggregate-functions.html#function_json-arrayagg)和[`JSON_OBJECTAGG（）`](aggregate-functions.html#function_json-objectagg). `JSON_ARRAYAGG（）`将列或表达式作为其参数，并将结果聚合为单个[`JSON`](json.html)大堆表达式可以计算为任何MySQL数据类型；这不一定是一个问题`JSON`价值`JSON_OBJECTAGG（）`获取两列或表达式，并将其解释为键和值；它将结果作为单个字符串返回`JSON`对象有关更多信息和示例，请参阅[第12.20节“聚合功能”](aggregate-functions-and-modifiers.html).

    -   添加了JSON实用程序函数[`JSON_PRETTY（）`](json-utility-functions.html#function_json-pretty)，它输出一个现有的[`JSON`](json.html)易于阅读的格式；每个JSON对象成员或数组值打印在单独的一行上，子对象或数组相对于其父对象有两个空格。

        该函数还可以处理可以解析为JSON值的字符串。

        有关更多详细信息和示例，请参阅[第12.18.8节，“JSON实用程序函数”](json-utility-functions.html).

    -   分拣时[`JSON`](json.html)使用`订购人`，每个值现在由排序键的可变长度部分表示，而不是固定1K大小的一部分。在许多情况下，这可以减少过度使用。例如，标量`国际的`甚至`比金`值实际上只需要很少的字节，所以这个空间的剩余部分（高达90%或更多）被填充占据。此更改对性能有以下好处：

        -   排序缓冲区空间现在得到了更有效的利用，因此文件排序不需要像固定长度的排序键那样提前或频繁地刷新到磁盘上。这意味着可以在内存中对更多数据进行排序，从而避免不必要的磁盘访问。

        -   较短的键可以比较长的键更快地进行比较，从而显著提高性能。对于完全在内存中执行的排序，以及需要向磁盘写入和从磁盘读取的排序，都是如此。

    -   在MySQL 8.0.2中增加了对`JSON`列值，这比完全删除现有的JSON值并在其位置写入新值更有效，就像之前更新任何JSON值时所做的那样`JSON`柱要应用此优化，必须使用[`JSON_SET（）`](json-modification-functions.html#function_json-set), [`JSON_REPLACE（）`](json-modification-functions.html#function_json-replace)或[`JSON_REMOVE（）`](json-modification-functions.html#function_json-remove)。无法将新元素添加到正在更新的JSON文档中；文档中的值不能比更新前占用更多空间。看见[JSON值的部分更新](json.html#json-partial-updates)，以详细讨论这些要求。

        JSON文档的部分更新可以写入二进制日志，比记录完整的JSON文档占用更少的空间。在使用基于语句的复制时，部分更新总是这样记录的。要使用基于行的复制，必须首先设置[`binlog_row_value_options=PARTIAL_JSON`](replication-options-binary-log.html#sysvar_binlog_row_value_options); 有关详细信息，请参阅此变量的说明。

    -   添加了JSON实用程序函数[`JSON_存储_大小（）`](json-utility-functions.html#function_json-storage-size)和[`JSON_存储_免费（）`](json-utility-functions.html#function_json-storage-free). `JSON_存储_大小（）`返回在任何部分更新之前用于JSON文档二进制表示的存储空间（以字节为单位）（请参阅上一项）。`JSON_存储_免费（）`显示类型为的表列中剩余的空间量[`JSON`](json.html)在使用`JSON_SET（）`或`JSON_REPLACE（）`; 如果新值的二进制表示形式小于前一个值的二进制表示形式，则该值大于零。

        每个函数还接受JSON文档的有效字符串表示形式。为了这样的价值，`JSON_存储_大小（）`返回其二进制表示形式转换为JSON文档后使用的空间。对于包含JSON文档字符串表示形式的变量，`JSON_存储_免费（）`返回零。如果其（非null）参数不能被解析为有效的JSON文档，则任一函数都会产生错误，并且`无效的`如果论点是正确的`无效的`.

        有关更多信息和示例，请参阅[第12.18.8节，“JSON实用程序函数”](json-utility-functions.html).

        `JSON_存储_大小（）`和`JSON_存储_免费（）`在MySQL 8.0.2中实现。

    -   在MySQL 8.0.2中增加了对以下范围的支持：`美元[1至5]`在XPath表达式中。在此版本中还添加了对`最后的`关键字和相对地址，例如`$[最后]`始终选择数组中最后一个（编号最高）元素，然后`$[last-1]`倒数第二个元素。`最后的`使用它的表达式也可以包含在范围定义中。例如`$[last-2至last-1]`返回最后两个元素，但一个元素来自数组。看见[搜索和修改JSON值](json.html#json-paths)，以获取更多信息和示例。

    -   添加了一个JSON合并函数，以符合[RFC 7396](https://tools.ietf.org/html/rfc7396). [`JSON_MERGE_PATCH（）`](json-modification-functions.html#function_json-merge-patch)，用于2个JSON对象时，将它们合并为一个JSON对象，该对象的成员包括以下集合的并集：

        -   第一个对象的每个成员，第二个对象中没有具有相同密钥的成员。

        -   第二个对象的每个成员，在第一个对象中没有成员具有相同的键，并且其值不是JSON`无效的`字面意义的

        -   每个成员都有一个键，该键存在于两个对象中，并且在第二个对象中的值不是JSON`无效的`字面意义的

            作为这项工作的一部分[`JSON_MERGE（）`](json-modification-functions.html#function_json-merge)函数已重命名[`JSON_MERGE_PRESERVE（）`](json-modification-functions.html#function_json-merge-preserve). `JSON_MERGE（）`继续被识别为的别名`JSON_MERGE_PRESERVE（）`在MySQL 8.0中，但现在已被弃用，并可能在MySQL的未来版本中被删除。

            有关更多信息和示例，请参阅[第12.18.4节，“修改JSON值的函数”](json-modification-functions.html).

    -   实现了重复密钥的“最后一次重复密钥赢”规范化，与[RFC 7159](https://tools.ietf.org/html/rfc7159)以及大多数JavaScript解析器。这里显示了这种行为的一个示例，其中只有最右边的成员拥有密钥`十、`被保留下来：

        ```
        mysql> SELECT JSON_OBJECT('x', '32', 'y', '[true, false]',
             >                     'x', '"abc"', 'x', '100') AS Result;
        +------------------------------------+
        | Result                             |
        +------------------------------------+
        | {"x": "100", "y": "[true, false]"} |
        +------------------------------------+
        1 row in set (0.00 sec)
        ```

        插入MySQL的值[`JSON`](json.html)列也以这种方式规范化，如本例所示：

        ```
        mysql> CREATE TABLE t1 (c1 JSON);

        mysql> INSERT INTO t1 VALUES ('{"x": 17, "x": "red", "x": [3, 5, 7]}');

        mysql> SELECT c1 FROM t1;
        +------------------+
        | c1               |
        +------------------+
        | {"x": [3, 5, 7]} |
        +------------------+
        ```

        这与之前版本的MySQL不兼容，MySQL在这种情况下使用了“第一次重复密钥赢”算法。

        看见[JSON值的规范化、合并和自动包装](json.html#json-normalization)，以获取更多信息和示例。

    -   补充道[`JSON_表（）`](json-table-functions.html#function_json-table)MySQL 8.0.4中的函数。此函数接受JSON数据，并将其作为具有指定列的关系表返回。

        此函数具有以下语法：`JSON_表(*`expr`*, *`路径`*纵队*`列列表`*)[作为]*`别名`*)`哪里*`expr`*是一个返回JSON数据的表达式，*`路径`*是应用于源的JSON路径，以及*`列列表`*是列定义的列表。此处显示了一个示例：

        ```
        mysql> SELECT *
            -> FROM
            ->   JSON_TABLE(
            ->     '[{"a":3,"b":"0"},{"a":"3","b":"1"},{"a":2,"b":1},{"a":0},{"b":[1,2]}]',
            ->     "$[*]" COLUMNS(
            ->       rowid FOR ORDINALITY,
            ->
            ->       xa INT EXISTS PATH "$.a",
            ->       xb INT EXISTS PATH "$.b",
            ->
            ->       sa VARCHAR(100) PATH "$.a",
            ->       sb VARCHAR(100) PATH "$.b",
            ->
            ->       ja JSON PATH "$.a",
            ->       jb JSON PATH "$.b"
            ->     )
            ->   ) AS  jt1;
        +-------+------+------+------+------+------+--------+
        | rowid | xa   | xb   | sa   | sb   | ja   | jb     |
        +-------+------+------+------+------+------+--------+
        |     1 |    1 |    1 | 3    | 0    | 3    | "0"    |
        |     2 |    1 |    1 | 3    | 1    | "3"  | "1"    |
        |     3 |    1 |    1 | 2    | 1    | 2    | 1      |
        |     4 |    1 |    0 | 0    | NULL | 0    | NULL   |
        |     5 |    0 |    1 | NULL | NULL | NULL | [1, 2] |
        +-------+------+------+------+------+------+--------+
        ```

        JSON源表达式可以是生成有效JSON文档的任何表达式，包括JSON文本、表列或返回JSON的函数调用，例如[`JSON_摘录（t1，数据，'$.post.comments'）`](json-search-functions.html#function_json-extract)。有关更多信息，请参阅[第12.18.6节，“JSON表函数”](json-table-functions.html).

-   **数据类型支持。**MySQL现在支持在数据类型规范中使用表达式作为默认值。这包括使用表达式作为[`斑点`](blob.html), [`文本`](blob.html), `几何学`和[`JSON`](json.html)数据类型，以前根本无法为其指定默认值。有关详细信息，请参阅[第11.6节，“数据类型默认值”](data-type-defaults.html).

    [](<>)[](<>)

-   **优化器。**添加了以下优化器增强功能：

    [](<>)[](<>)

    -   MySQL现在支持不可见索引。优化器根本不使用不可见索引，但通常会维护它。默认情况下，索引是可见的。不可见索引可以测试删除索引对查询性能的影响，而无需进行破坏性的更改，如果需要索引，则必须撤消这些更改。看见[第8.3.12节，“无形指数”](invisible-indexes.html).

    -   MySQL现在支持降序索引：`描述`在索引中，定义不再被忽略，而是导致按降序存储键值。以前，索引可以按相反的顺序扫描，但性能会受到影响。降序索引可以按正向顺序扫描，这样效率更高。当最有效的扫描顺序混合了某些列的升序和其他列的降序时，降序索引还使优化器可以使用多个列索引。看见[第8.3.13节，“递减指数”](descending-indexes.html).

    -   MySQL现在支持创建索引表达式值而不是列值的函数索引键部分。功能关键部件支持对无法以其他方式索引的值进行索引，例如[`JSON`](json.html)价值观有关详细信息，请参阅[第13.1.15节，“创建索引语句”](create-index.html).

    -   在MySQL 8.0.14及更高版本中`哪里`常量文字表达式产生的条件将在准备过程中删除，而不是稍后在优化过程中删除。在该过程的早期删除该条件，可以简化查询的联接，外部联接具有简单的条件，例如：

        ```
        SELECT * FROM t1 LEFT JOIN t2 ON condition_1 WHERE condition_2 OR 0 = 1
        ```

        优化器现在在准备过程中看到0=1总是假的，这使得`或0=1`冗余，并将其删除，留下以下内容：

        ```
        SELECT * FROM t1 LEFT JOIN t2 ON condition_1 where condition_2
        ```

        现在，优化器可以将查询重写为内部联接，如下所示：

        ```
        SELECT * FROM t1 LEFT JOIN t2 WHERE condition_1 AND condition_2
        ```

        有关更多信息，请参阅[第8.2.1.9节，“外部连接优化”](outer-join-optimization.html).

    -   在MySQL 8.0.16及更高版本中，MySQL可以在优化时使用常量折叠来处理列与常量值之间的比较，其中常量超出范围或位于与列类型相关的范围边界上，而不是在执行时对每一行进行比较。例如，给定一张表`t`用一个`TINYINT未签名`柱`c`，优化器可以重写以下条件：`其中c<256`到`其中1`（并完全优化条件），或`其中c>=255`到`其中c=255`.

        看见[第8.2.1.14节，“恒定折叠优化”](constant-folding-optimization.html)，以获取更多信息。

    -   从MySQL 8.0.16开始，使用`在里面`子查询现在可以应用于`存在`子查询也是如此。此外，优化器现在在`哪里`附加到子查询的条件，以便可以类似于中的表达式来处理它们`在里面`子查询；这两种情况都适用`存在`和`在里面`子查询。

        有关更多信息，请参阅[第8.2.2.1节，“使用半连接转换优化IN和EXISTS子查询谓词”](semijoins.html).

    -   从MySQL 8.0.17开始，服务器会重写任何不完整的SQL谓词（即具有`在哪里*`价值`*`，其中*`价值`*是列名或常量表达式，内部未使用比较运算符）`在哪里*`价值`* <> 0`在上下文化阶段，查询解析器、查询优化器和查询执行器只需要使用完整的谓词。

        这种变化的一个明显效果是，对于布尔值，[`解释`](explain.html)输出现在显示`符合事实的`和`错误的`而不是`1.`和`0`.

        此更改的另一个影响是，在SQL布尔上下文中计算JSON值时，会与JSON整数0进行隐式比较。考虑创建和填充的表，如下面所示：

        ```
        mysql> CREATE TABLE test (id INT, col JSON);

        mysql> INSERT INTO test VALUES (1, '{"val":true}'), (2, '{"val":false}');
        ```

        之前，服务器试图转换提取的`符合事实的`或`错误的`在SQL布尔值上下文中比较时，将值设置为SQL布尔值，如下使用`这是真的`:

        ```
        mysql> SELECT id, col, col->"$.val" FROM test WHERE col->"$.val" IS TRUE;
        +------+---------------+--------------+
        | id   | col           | col->"$.val" |
        +------+---------------+--------------+
        |    1 | {"val": true} | true         |
        +------+---------------+--------------+
        ```

        在MySQL 8.0.17及更高版本中，提取值与JSON整数0的隐式比较会导致不同的结果：

        ```
        mysql> SELECT id, col, col->"$.val" FROM test WHERE col->"$.val" IS TRUE;
        +------+----------------+--------------+
        | id   | col            | col->"$.val" |
        +------+----------------+--------------+
        |    1 | {"val": true}  | true         |
        |    2 | {"val": false} | false        |
        +------+----------------+--------------+
        ```

        从MySQL 8.0.21开始，您可以使用[`JSON_值（）`](json-search-functions.html#function_json-value)在执行测试之前，根据提取的值执行类型转换，如下所示：

        ```
        mysql> SELECT id, col, col->"$.val" FROM test
            ->     WHERE JSON_VALUE(col, "$.val" RETURNING UNSIGNED) IS TRUE;
        +------+---------------+--------------+
        | id   | col           | col->"$.val" |
        +------+---------------+--------------+
        |    1 | {"val": true} | true         |
        +------+---------------+--------------+
        ```

        同样从MySQL 8.0.21开始，服务器提供警告，在SQL布尔上下文中评估JSON值，并与JSON整数0进行隐式比较；如果这不是您想要的，请考虑用JSON将JSON转换为SQL数值类型。\_以这种方式比较SQL布尔上下文中提取的值时返回的值。

    -   在MySQL 8.0.17及更高版本中`哪里`有条件`不在(*`子查询`*)`或`不存在(*`子查询`*)`在内部转换为反连接。（反联接返回表中的所有行，该表中没有与联接条件匹配的行。）这将删除子查询，因为子查询的表现在是在顶层处理的，因此子查询可以更快地执行查询。

        这类似于并重用现有的`是空的` (`不存在`)优化外部连接；看见[解释额外信息](explain-output.html#explain-extra-information).

    -   从MySQL 8.0.21开始，一个表[`使现代化`](update.html)或[`删去`](delete.html)语句现在在许多情况下可以使用半连接转换或子查询具体化。这适用于以下表格的陈述：

        -   `更新t1集合t1。a=*`价值`*这里是t1。a IN（从t2中选择t2.a）`

        -   `从t1中删除，其中t1。a IN（从t2中选择t2.a）`

            这可以在一张桌子上完成`使现代化`或`删去`符合下列条件：

        -   这个`使现代化`或`删去`语句使用具有`[不]在`或`[不]存在`谓语

        -   这份声明没有任何意义`订购人`子句，并且没有`限度`条款

            （多表版本的`使现代化`和`删去`不支持`订购人`或`限度`.)

        -   目标表不支持先读后写删除（仅适用于[`NDB`](mysql-cluster.html)表）。

        -   基于子查询中包含的任何提示和[`优化器_开关`](server-system-variables.html#sysvar_optimizer_switch).

            当半联接优化用于符合条件的单个表时`删去`或`使现代化`，这在优化器跟踪中可见：对于多表语句`加入优化`对象，而对于单个表语句则没有。转换也可以在的输出中看到`解释格式=树`或[`解释分析`](explain.html#explain-analyze); 单表语句显示`<迭代器执行器不可执行>`，而多表语句则报告完整的计划。

            Alo从MySQL 8.0.21开始，多表支持半一致读取`使现代化`使用[`InnoDB`](innodb-storage-engine.html)表，用于低于[`可重复读取`](innodb-transaction-isolation-levels.html#isolevel_repeatable-read).

    -   **提高了哈希连接性能。**MySQL 8.0.23重新实现了用于哈希连接的哈希表，从而在哈希连接性能方面取得了一些改进。这项工作包括修复一个问题（Bug#31516149，Bug#99933），其中只有大约2/3的内存分配给联接缓冲区([`加入缓冲区大小`](server-system-variables.html#sysvar_join_buffer_size))实际上可以被散列连接使用。

        新的哈希表通常比旧的哈希表更快，并且在对齐、键/值以及存在许多相等键的情况下使用更少的内存。此外，当哈希表的大小增加时，服务器现在可以释放旧内存。

-   **常见的表表达式。**MySQL现在支持常用的表表达式，包括非递归和递归。公共表表达式允许使用命名的临时结果集，通过允许[`具有`](with.html)前面的条款[`选择`](select.html)声明和某些其他声明。有关更多信息，请参阅[第13.2.15节，“带（通用表格表达式）”](with.html).

    [](<>)[](<>)

    从MySQL 8.0.19开始，递归[`选择`](select.html)递归公共表表达式（CTE）的一部分支持`限度`条款`限度`具有`抵消`也支持。看见[递归公共表表达式](with.html#common-table-expressions-recursive)，以获取更多信息。

-   **窗口功能。**MySQL现在支持窗口函数，对于查询中的每一行，使用与该行相关的行执行计算。这些功能包括[`秩（）`](window-function-descriptions.html#function_rank), [`滞后（）`](window-function-descriptions.html#function_lag)和[`安提尔（）`](window-function-descriptions.html#function_ntile).此外，现有的几个聚合函数现在可以用作窗口函数（例如，[`SUM（）`](aggregate-functions.html#function_sum)和[`平均值（）`](aggregate-functions.html#function_avg))。有关更多信息，请参阅[第12.21节“窗口功能”](window-functions.html).

    [](<>)[](<>)

-   **横向派生表。**现在，派生表前面可能会有`侧面的`关键字来指定允许在同一个表中引用（依赖）前面表的列`从…起`条款横向派生表使某些SQL操作成为可能，这些操作无法用非横向派生表完成，或者需要效率较低的变通方法。看见[第13.2.11.9节，“横向衍生表格”](lateral-derived-tables.html).

    [](<>)[](<>)

-   **单表DELETE语句中的别名。**在MySQL 8.0.16及更高版本中，单表[`删去`](delete.html)语句支持使用表别名。

    [](<>)[](<>)

-   **正则表达式支持。**之前，MySQL使用Henry Spencer正则表达式库来支持正则表达式运算符([`REGEXP`](regexp.html#operator_regexp), [`像`](regexp.html#operator_regexp)).正则表达式支持已使用国际Unicode组件（ICU）重新实现，该组件提供完整的Unicode支持，并且是多字节安全的。这个[`REGEXP_LIKE（）`](regexp.html#function_regexp-like)函数以[`REGEXP`](regexp.html#operator_regexp)和[`像`](regexp.html#operator_regexp)运算符，现在是该函数的同义词。此外[`REGEXP_INSTR（）`](regexp.html#function_regexp-instr), [`REGEXP_REPLACE（）`](regexp.html#function_regexp-replace)和[`REGEXP_SUBSTR（）`](regexp.html#function_regexp-substr)函数分别用于查找匹配位置和执行子字符串替换和提取。这个[`regexp_stack_limit`](server-system-variables.html#sysvar_regexp_stack_limit)和[`regexp_时间限制`](server-system-variables.html#sysvar_regexp_time_limit)系统变量通过匹配引擎控制资源消耗。有关更多信息，请参阅[第12.8.2节“正则表达式”](regexp.html)。有关使用正则表达式的应用程序可能受到实现更改影响的方式的信息，请参阅[正则表达式兼容性注意事项](regexp.html#regexp-compatibility).

    [](<>)[](<>)

-   **内部临时表。**那个`诱人的`存储引擎取代了`记忆力`存储引擎作为内存内部临时表的默认引擎。这个`诱人的`存储引擎为用户提供高效的存储[`瓦尔查尔`](char.html)和[`VARBINARY`](binary-varbinary.html)柱。这个[`内部存储引擎`](server-system-variables.html#sysvar_internal_tmp_mem_storage_engine)会话变量定义内存内部临时表的存储引擎。允许值为`诱人的`（默认）和`记忆力`这个[`诱人的_max_ram`](server-system-variables.html#sysvar_temptable_max_ram)变量定义了`诱人的`存储引擎可以在数据存储到磁盘之前使用。

    [](<>)[](<>)

-   **登录中。**错误日志被重写为使用MySQL组件体系结构。传统的错误记录是使用内置组件实现的，而使用系统日志的记录是作为可加载组件实现的。此外，还提供了可加载的JSON日志编写器。要控制要启用的日志组件，请使用[`日志错误服务`](server-system-variables.html#sysvar_log_error_services)系统变量。有关更多信息，请参阅[第5.4.2节“错误日志”](error-log.html).

    [](<>)[](<>)

-   **备用锁。**一种新型的备份锁允许在在线备份期间使用DML，同时防止可能导致快照不一致的操作。新的备份锁受[`锁定备份实例`](lock-instance-for-backup.html)和[`解锁实例`](lock-instance-for-backup.html)语法。这个[`备份管理`](privileges-provided.html#priv_backup-admin)使用这些语句需要特权。

    [](<>)[](<>)

-   **复制。**对MySQL复制进行了以下增强：

    [](<>)[](<>)

    -   MySQL复制现在支持使用紧凑的二进制格式对JSON文档的部分更新进行二进制记录，在记录完整的JSON文档时节省了日志空间。当使用基于语句的日志记录时，这种紧凑的日志记录会自动完成，并且可以通过设置新的`binlog_行_值_选项`系统变量为`部分_JSON`。有关更多信息，请参阅[JSON值的部分更新](json.html#json-partial-updates)，以及[`binlog_行_值_选项`](replication-options-binary-log.html#sysvar_binlog_row_value_options).

-   **连接管理。**MySQL服务器现在允许专门为管理连接配置TCP/IP端口。这提供了一种替代单一管理连接的方法，该方法允许在用于普通连接的网络接口上使用，即使在[`max_连接`](server-system-variables.html#sysvar_max_connections)连接已经建立。看见[第5.1.12.1节“连接接口”](connection-interfaces.html).

    [](<>)[](<>)

    MySQL现在提供了对压缩使用的更多控制，以最小化通过连接发送到服务器的字节数。以前，给定的连接要么未压缩，要么使用`兹利布`压缩算法。现在，也可以使用`zstd`算法，并为`zstd`连接。允许的压缩算法可以在服务器端配置，也可以在连接发起端配置，以通过客户端程序和参与源/副本复制或组复制的服务器进行连接。有关更多信息，请参阅[第4.2.8节，“连接压缩控制”](connection-compression-control.html).

-   **配置**MySQL中主机名的最大允许长度已从之前的60个字符提高到255个ASCII字符。例如，这适用于数据字典中与主机名相关的列，`mysql`系统模式，性能模式，`信息模式`和`系统`图式；这个`主播`价值观[`将主机更改为`](change-master-to.html)陈述这个`主办`列在[`显示进程列表`](show-processlist.html)语句输出；帐户名中的主机名（例如用于帐户管理报表和`定义者`属性）；以及与主机名相关的命令选项和系统变量。

    [](<>)[](<>)[](<>)

    注意事项：

    -   允许的主机名长度的增加可能会影响在主机名列上具有索引的表。例如，中的表`mysql`索引主机名的系统架构现在有一个显式`行格式`属性`动态`以适应更长的索引值。

    -   某些文件名值的配置设置可能基于服务器主机名构建。允许的值受基础操作系统的约束，该操作系统可能不允许文件名的长度足以包含255个字符的主机名。这会影响到[`常规日志文件`](server-system-variables.html#sysvar_general_log_file), [`日志错误`](server-system-variables.html#sysvar_log_error), [`pid_文件`](server-system-variables.html#sysvar_pid_file), [`中继日志`](replication-options-replica.html#sysvar_relay_log)和[`慢速查询日志文件`](server-system-variables.html#sysvar_slow_query_log_file)系统变量和相应的选项。如果基于主机名的值对于操作系统来说太长，则必须提供显式的较短值。

    -   虽然服务器现在支持255个字符的主机名，但使用[`--ssl模式=验证身份`](connection-options.html#option_general_ssl-mode)选项受OpenSSL支持的最大主机名长度限制。主机名匹配与SSL证书的两个字段有关，它们的最大长度如下：公共名称：最大长度64；受试者备选名称：RFC#1034规定的最大长度。

-   **插件。**以前，MySQL插件可以用C或C++编写。现在插件使用的MySQL头文件包含C++代码，这意味着插件必须用C++编写，而不是C。

    [](<>)[](<>)

-   **C API。**MySQL C API现在支持与MySQL服务器进行非阻塞通信的异步函数。每个函数都是现有同步函数的异步对应项。同步功能会阻止对服务器连接的读取或写入是否必须等待。异步函数使应用程序能够检查服务器连接上的工作是否准备好继续。如果没有，应用程序可以在稍后再次检查之前执行其他工作。看见[C API异步接口](https://dev.mysql.com/doc/c-api/8.0/en/c-api-asynchronous-interface.html).

    [](<>)[](<>)

-   **用于强制转换的其他目标类型。**功能[`演员阵容`](cast-functions.html#function_cast)和[`CONVERT（）`](cast-functions.html#function_convert)现在支持类型转换[`双重的`](floating-point-types.html), [`浮动`](floating-point-types.html)和[`真实的`](floating-point-types.html).添加到MySQL 8.0.17中。看见[第12.11节，“转换函数和运算符”](cast-functions.html).

    [](<>)[](<>)

-   **JSON模式验证。**MySQL 8.0.17增加了两个功能[`JSON_SCHEMA_VALID（）`](json-validation-functions.html#function_json-schema-valid)和[`JSON_模式_验证_报告（）`](json-validation-functions.html#function_json-schema-validation-report)用于再次验证JSON文档JSON模式。`JSON_SCHEMA_VALID（）`如果文档根据架构进行验证，则返回TRUE（1），否则返回FALSE（0）。`JSON_模式_验证_报告（）`返回一个JSON文档，其中包含有关验证结果的详细信息。以下语句适用于这两种功能：

    [](<>)[](<>)

    -   模式必须符合JSON模式规范草案4。

    -   `必修的`支持属性。

    -   外部资源和`$ref`关键字不受支持。

    -   支持正则表达式模式；无效模式会被默默忽略。

        看见[第12.18.7节，“JSON模式验证功能”](json-validation-functions.html)，以获取更多信息和示例。

-   **多值索引。**从MySQL 8.0.17开始，[`InnoDB`](innodb-storage-engine.html)支持创建多值索引，该索引是在[`JSON`](json.html)列，该列存储一个值数组，对于单个数据记录可以有多个索引记录。这样的索引使用关键部分定义，例如`强制转换（数据->“$.zipcode”作为无符号数组）`.MySQL优化器会自动使用多值索引进行适当的查询，这可以在[`解释`](explain.html).

    [](<>)[](<>)

    作为这项工作的一部分，MySQL添加了一个新函数[`JSON_重叠（）`](json-search-functions.html#function_json-overlaps)还有一个新的[`成员（）`](json-search-functions.html#operator_member-of)接线员[`JSON`](json.html)文档，另外扩展了[`演员阵容`](cast-functions.html#function_cast)使用新的`大堆`关键字，如下表所述：

    -   `JSON_重叠（）`比较两个[`JSON`](json.html)文件。如果它们共同包含任何键值对或数组元素，则函数返回TRUE（1）；否则返回FALSE（0）。如果两个值都是标量，则函数将执行简单的相等性测试。如果一个参数是JSON数组，另一个是标量，则标量将被视为数组元素。因此`JSON_重叠（）`起到补充的作用[`JSON_CONTAINS（）`](json-search-functions.html#function_json-contains).

    -   `成员（）`测试第一个操作数（标量或JSON文档）是否是作为第二个操作数传递的JSON数组的成员，如果是，则返回TRUE（1），如果不是，则返回FALSE（0）。不执行操作数的类型转换。

    -   `投下(`表示`像`类型`阵列）`允许通过将JSON文档中的JSON数组转换为*`json_路径`*到SQL数组。类型说明符仅限于`演员阵容`，但`二进制的`（不支持）。这种用法`演员阵容`（以及`大堆`关键字）仅由支持[`InnoDB`](innodb-storage-engine.html)，并且仅用于创建多值索引。

        有关多值索引的详细信息（包括示例），请参见[多值索引](create-index.html#create-index-multi-valued). [第12.18.3节，“搜索JSON值的函数”](json-search-functions.html)，提供有关`JSON_重叠（）`和`成员（）`，以及使用示例。

-   **可预测的时间\_区**从MySQL 8.0.17开始[`时区`](server-system-variables.html#sysvar_time_zone)会话变量可以使用[`集_VAR`](optimizer-hints.html#optimizer-hints-set-var).

    [](<>)[](<>)

-   **重做日志归档。**从MySQL 8.0.17开始，`InnoDB`支持重做日志归档。在备份操作进行期间，复制重做日志记录的备份实用程序有时可能无法跟上重做日志生成的速度，从而导致由于覆盖这些记录而丢失重做日志记录。重做日志存档功能通过将重做日志记录顺序写入存档文件来解决此问题。备份实用程序可以根据需要从存档文件中复制重做日志记录，从而避免潜在的数据丢失。有关更多信息，请参阅[重做日志归档](innodb-redo-log.html#innodb-redo-log-archiving).

    [](<>)[](<>)

-   **克隆插件。**从MySQL 8.0.17开始，MySQL提供了一个允许克隆的克隆插件`InnoDB`本地数据或来自远程MySQL服务器实例的数据。本地克隆操作将克隆的数据存储在运行MySQL实例的同一服务器或节点上。远程克隆操作通过网络将克隆数据从捐赠方MySQL服务器实例传输到发起克隆操作的接收方服务器或节点。

    [](<>)[](<>)

    克隆插件支持复制。除了克隆数据外，克隆操作还从捐赠者提取和传输复制坐标，并将其应用于接收者，这样就可以使用克隆插件来配置组复制成员和副本。使用克隆插件进行资源调配比复制大量事务要快得多、效率更高。还可以将组复制成员配置为使用克隆插件作为恢复的替代方法，以便成员自动选择从种子成员检索组数据的最有效方式。

    有关更多信息，请参阅[第5.6.7节，“克隆插件”](clone-plugin.html)和[第18.5.4.2节，“用于分布式恢复的克隆”](group-replication-cloning.html).

    从MySQL 8.0.27开始，在进行克隆操作时，允许在捐赠方MySQL服务器实例上执行并发DDL操作。以前，克隆操作期间保留了一个备份锁，防止了供体上的并发DDL。要恢复到以前在克隆操作期间阻止供体上并发DDL的行为，请启用[`克隆块ddl`](clone-plugin-options-variables.html#sysvar_clone_block_ddl)变量看见[第5.6.7.4节，“克隆和并发DDL”](clone-plugin-concurrent-ddl.html).

    从MySQL 8.0.29开始[`数据删除后的克隆延迟`](clone-plugin-options-variables.html#sysvar_clone_delay_after_data_drop)变量允许在远程克隆操作开始时删除收件人MySQL服务器实例上的现有数据后立即指定延迟期。延迟是为了在从捐赠方MySQL服务器实例克隆数据之前，为接收方主机上的文件系统提供足够的时间释放空间。某些文件系统在后台进程中异步释放空间。在这些文件系统上，删除现有数据后过早克隆数据可能会由于空间不足而导致克隆操作失败。最大延迟时间为3600秒（1小时）。默认设置为0（无延迟）。

-   **哈希连接优化。**从MySQL 8.0.18开始，只要连接中的每对表至少包含一个equi连接条件，并且没有索引应用于任何连接条件，就会使用哈希连接。哈希联接不需要索引，尽管它可以与仅应用于单表谓词的索引一起使用。在大多数情况下，哈希连接比块嵌套循环算法更有效。此处所示的连接可以通过以下方式进行优化：

    [](<>)[](<>)

    ```
    SELECT *
        FROM t1
        JOIN t2
            ON t1.c1=t2.c1;

    SELECT *
        FROM t1
        JOIN t2
            ON (t1.c1 = t2.c1 AND t1.c2 < t2.c2)
        JOIN t3
            ON (t2.c1 = t3.c1)
    ```

    散列联接也可用于笛卡尔乘积，即未指定联接条件时。

    您可以看到哈希连接优化何时用于使用[`解释格式=树`](explain.html)或[`解释分析`](explain.html#explain-analyze)（在MySQL 8.0.20及更高版本中，您还可以使用`解释`，省略`格式=树`.)

    哈希联接可用的内存量受[`加入缓冲区大小`](server-system-variables.html#sysvar_join_buffer_size).在磁盘上执行的哈希连接需要的内存超过了这个数量；磁盘上哈希联接可以使用的磁盘文件数量受以下限制：[`打开\u文件\u限制`](server-system-variables.html#sysvar_open_files_limit).

    从MySQL 8.0.19开始[`hash_join`](switchable-optimizations.html#optflag_hash-join)MySQL 8.0.18中引入的优化器开关不再受支持（哈希）\_join=on仍然作为优化器值的一部分出现\_开关，但设置它不再有任何效果）。这个[`HASH_JOIN`](optimizer-hints.html#optimizer-hints-table-level)和`不加入`优化器提示也不再受支持。开关和提示现在都不推荐使用；希望在未来的MySQL版本中删除它们。在MySQL 8.0.18及更高版本中，可以使用[`没有`](optimizer-hints.html#optimizer-hints-table-level)优化器开关。

    在MySQL 8.0.20及更高版本中，MySQL服务器不再使用块嵌套循环，并且在以前使用块嵌套循环的任何时候都会使用哈希联接，即使查询不包含相等联接条件。这适用于内部非等联接、半联接、反联接、左外联接和右外联接。t这个[`块嵌套循环`](switchable-optimizations.html#optflag_block-nested-loop)美国国旗[`优化器_开关`](server-system-variables.html#sysvar_optimizer_switch)系统变量以及[`BNL`](optimizer-hints.html#optimizer-hints-table-level)和`没有`优化器提示仍然受支持，但此后仅控制哈希联接的使用。此外，内部联接和外部联接（包括半联接和反联接）现在都可以使用批处理密钥访问（BKA），它以增量方式分配联接缓冲区内存，这样单个查询就不需要占用它们在解析时实际上不需要的大量资源。从MySQL 8.0.18开始，只支持用于内部联接的BKA。

    MySQL 8.0.20还将以前版本的MySQL中使用的执行器替换为迭代器执行器。这项工作包括替换管理表单查询的旧索引子查询引擎`在哪里*`价值`*在（选择）中*`柱`*来自*`桌子`*在哪里……）`为了那些`在里面`未优化为半连接的查询，以及以相同形式具体化的查询，它们以前依赖于旧的执行器。

    有关更多信息和示例，请参阅[第8.2.1.4节，“哈希连接优化”](hash-joins.html).另见[批处理密钥访问连接](bnl-bka-optimization.html#bka-optimization).

-   **解释分析陈述。**一种新形式的[`解释`](explain.html)陈述[`解释分析`](explain.html#explain-analyze)，在MySQL 8.0.18中实现，提供了有关[`选择`](select.html)声明`树`处理查询时使用的每个迭代器的格式，并使其能够将估计成本与查询的实际成本进行比较。这些信息包括启动成本、总成本、迭代器返回的行数以及执行的循环数。

    在MySQL 8.0.21及更高版本中，此语句还支持`格式=树`说明符。`树`是唯一受支持的格式。

    [](<>)[](<>)

    看见[通过解释分析获取信息](explain.html#explain-analyze)，以获取更多信息。

-   **查询铸注。**在8.0.18及更高版本中，MySQL在参数的数据类型和预期数据类型不匹配的表达式和条件中向查询项树中注入强制转换操作。这对查询结果或执行速度没有影响，但使执行时的查询相当于符合SQL标准的查询，同时保持与MySQL早期版本的向后兼容性。

    [](<>)[](<>)

    这种隐式转换现在在时态类型之间执行([`日期`](datetime.html), [`约会时间`](datetime.html), [`时间戳`](datetime.html), [`时间`](time.html))和数字类型([`斯莫林`](integer-types.html), [`TINYINT`](integer-types.html), [`中微子`](integer-types.html), [`国际的`](integer-types.html)/[`整数`](integer-types.html), [`比金`](integer-types.html); [`十进制的`](fixed-point-types.html)/[`数字的`](fixed-point-types.html); [`浮动`](floating-point-types.html), [`双重的`](floating-point-types.html), [`真实的`](floating-point-types.html); [`一点`](bit-type.html))无论何时使用任何标准的数值比较运算符进行比较([`=`](assignment-operators.html#operator_assign-equal), [`>=`](comparison-operators.html#operator_greater-than-or-equal), [`>`](comparison-operators.html#operator_greater-than), [`<`](comparison-operators.html#operator_less-than), [`<=`](comparison-operators.html#operator_less-than-or-equal), [`<>`](comparison-operators.html#operator_not-equal)/[`!=`](comparison-operators.html#operator_not-equal)或[`<=>`](comparison-operators.html#operator_equal-to)).在本例中，任何尚未成为`双重的`是一个演员。现在还进行了铸件注射，以比较[`日期`](datetime.html)或[`时间`](time.html)价值观和[`约会时间`](datetime.html)值，根据需要随时转换参数`约会时间`.

    从MySQL 8.0.21开始，在比较字符串类型和其他类型时，也会执行此类强制转换。强制转换的字符串类型包括[`烧焦`](char.html), [`瓦尔查尔`](char.html), [`二进制的`](binary-varbinary.html), [`VARBINARY`](binary-varbinary.html), [`斑点`](blob.html), [`文本`](blob.html), [`枚举`](enum.html)和[`设置`](set.html).当比较字符串类型的值与数字类型或`年`，弦乐演员是`双重的`; 如果另一个参数的类型不是`浮动`, `双重的`或`真实的`，它也是为了`双重的`.将字符串类型与`约会时间`或`时间戳`值，则字符串被强制转换为`约会时间`; 将字符串类型与`日期`，弦被抛向`日期`.

    通过查看[`解释分析`](explain.html#explain-analyze), `EXPLAIN FORMAT=JSON`，或者，如图所示，`解释格式=树`:

    ```
    mysql> CREATE TABLE d (dt DATETIME, d DATE, t TIME);
    Query OK, 0 rows affected (0.62 sec)

    mysql> CREATE TABLE n (i INT, d DECIMAL, f FLOAT, dc DECIMAL);
    Query OK, 0 rows affected (0.51 sec)

    mysql> CREATE TABLE s (c CHAR(25), vc VARCHAR(25),
        ->     bn BINARY(50), vb VARBINARY(50), b BLOB, t TEXT,
        ->     e ENUM('a', 'b', 'c'), se SET('x' ,'y', 'z'));
    Query OK, 0 rows affected (0.50 sec)

    mysql> EXPLAIN FORMAT=TREE SELECT * from d JOIN n ON d.dt = n.i\G
    *************************** 1. row ***************************
    EXPLAIN: -> Inner hash join (cast(d.dt as double) = cast(n.i as double))
    (cost=0.70 rows=1)
        -> Table scan on n  (cost=0.35 rows=1)
        -> Hash
            -> Table scan on d  (cost=0.35 rows=1)

    mysql> EXPLAIN FORMAT=TREE SELECT * from s JOIN d ON d.dt = s.c\G
    *************************** 1. row ***************************
    EXPLAIN: -> Inner hash join (d.dt = cast(s.c as datetime(6)))  (cost=0.72 rows=1)
        -> Table scan on d  (cost=0.37 rows=1)
        -> Hash
            -> Table scan on s  (cost=0.35 rows=1)

    1 row in set (0.01 sec)

    mysql> EXPLAIN FORMAT=TREE SELECT * from n JOIN s ON n.d = s.c\G
    *************************** 1. row ***************************
    EXPLAIN: -> Inner hash join (cast(n.d as double) = cast(s.c as double))  (cost=0.70 rows=1)
        -> Table scan on s  (cost=0.35 rows=1)
        -> Hash
            -> Table scan on n  (cost=0.35 rows=1)

    1 row in set (0.00 sec)
    ```

    也可以通过执行`解释[格式=传统]`，在这种情况下，还需要发布[`显示警告`](show-warnings.html)在执行`解释`陈述

-   **时区支持时间戳和日期时间。**从MySQL 8.0.19开始，服务器接受带有插入日期时间的时区偏移([`时间戳`](datetime.html)和[`约会时间`](datetime.html))价值观。该偏移量使用的格式与设置偏移量时使用的格式相同[`时区`](server-system-variables.html#sysvar_time_zone)系统变量，但当偏移的小时数部分小于10时，需要前导零，以及`'-00:00'`这是不允许的。包含时区偏移的日期时间文字的示例包括`'2019-12-11 10:40:30-05:00'`, `'2003-04-14 03:30:00+10:00'`和`'2020-01-01 15:35:45+05:30'`.

    [](<>)[](<>)

    选择日期时间值时不显示时区偏移。

    包含时区偏移的Datetime文字可以用作准备好的语句参数值。

    作为这项工作的一部分，用于设置[`时区`](server-system-variables.html#sysvar_time_zone)系统变量现在也被限制在该范围内`-13:59`到`+14:00`包含全部费用（仍然可以将名称值指定给`时区`例如`“EST”`, `“Posix/澳大利亚/布里斯班”`和`“欧洲/斯德哥尔摩”`如果加载了MySQL时区表，则返回该变量；看见[填充时区表](time-zone-support.html#time-zone-installation)).

    有关更多信息和示例，请参阅[第5.1.15节，“MySQL服务器时区支持”](time-zone-support.html)以及[第11.2.2节，“日期、日期时间和时间戳类型”](datetime.html).

-   **JSON模式检查约束失败的精确信息。**使用时[`JSON_SCHEMA_VALID（）`](json-validation-functions.html#function_json-schema-valid)指定`检查`MySQL 8.0.19及更高版本提供了有关此类约束失败原因的精确信息。

    [](<>)[](<>)

    有关示例和更多信息，请参阅[JSON\_模式\_VALID（）并检查约束](json-validation-functions.html#json-validation-functions-constraints).另见[第13.1.20.6节“检查约束”](create-table-check-constraints.html).

-   **行和列别名在重复键更新时具有。**从MySQL 8.0.19开始，可以使用别名引用要插入的行，以及可选的列。考虑以下事项[`插入`](insert.html)桌子上的声明`t`有柱子的`A.`和`b`:

    [](<>)[](<>)

    ```
    INSERT INTO t SET a=9,b=5
        ON DUPLICATE KEY UPDATE a=VALUES(a)+VALUES(b);
    ```

    使用别名`新`对于新行，以及在某些情况下，别名`m`和`n`对于此行的列`插入`语句可以用许多不同的方式重写，下面给出了一些例子：

    ```
    INSERT INTO t SET a=9,b=5 AS new
        ON DUPLICATE KEY UPDATE a=new.a+new.b;

    INSERT INTO t VALUES(9,5) AS new
        ON DUPLICATE KEY UPDATE a=new.a+new.b;

    INSERT INTO t SET a=9,b=5 AS new(m,n)
        ON DUPLICATE KEY UPDATE a=m+n;

    INSERT INTO t VALUES(9,5) AS new(m,n)
        ON DUPLICATE KEY UPDATE a=m+n;
    ```

    有关更多信息和示例，请参阅[第13.2.6.2节，“在重复密钥更新声明中插入…”](insert-on-duplicate.html).

-   **SQL标准显式表子句和表值构造函数。**根据SQL标准添加了表值构造函数和显式表子句。它们分别在MySQL 8.0.19中实现，如下所示：[`桌子`](table.html)声明和[`价值观`](values.html)陈述

    [](<>)[](<>)[](<>)[](<>)

    这个[`桌子`](table.html)声明的格式是`桌子*`表2\\u名称`*`，相当于`从中选择**`表2\\u名称`*`.它支持`订购人`和`限度`子句（后者带有可选`抵消`)，但不允许选择单个表列。`桌子`可以在任何你愿意使用同等产品的地方使用[`选择`](select.html)陈述这包括加入工会，[`插入选择`](insert-select.html), [`代替`](replace.html), [`创建表格。。。选择`](create-table-select.html)语句和子查询。例如：

    -   `表t1和表t2`相当于`从t1选择*从t2选择*`

    -   `创建表t2表t1`相当于`创建表t2从t1中选择*`

    -   `从t1中选择a，其中b>任意（表t2）`相当于`从t1中选择a，其中b>任意（从t2中选择*`.

    [`价值观`](values.html)可用于向[`插入`](insert.html), [`代替`](replace.html)或[`选择`](select.html)语句，并由`价值观`关键字后跟一系列行构造函数(`第（）行`)用逗号分隔。例如，声明`插入t1值行（1,2,3），行（4,5,6），行（7,8,9）`提供与特定于MySQL的`插入t1值（1,2,3）、（4,5,6）、（7,8,9）`。您也可以从[`价值观`](values.html)表值构造函数，就像创建表一样，请记住在创建表时必须提供表别名，并使用[`选择`](select.html)就像其他人一样；这包括联接、联合和子查询。

    有关`桌子`和`价值观`，有关其使用示例，请参阅本文档的以下部分：

    -   [第13.2.12节“表格报表”](table.html)

    -   [第13.2.14节“价值声明”](values.html)

    -   [第13.1.20.4节，“创建表…选择语句”](create-table-select.html)

    -   [第13.2.6.1节，“插入……选择语句”](insert-select.html)

    -   [第13.2.10.2节“连接条款”](join.html)

    -   [第13.2.11节“子查询”](subqueries.html)

    -   [第13.2.10.3节“工会条款”](union.html)

-   **优化器提示强制索引，忽略索引。**MySQL 8.0引入了索引级优化器提示，类似于中所述的传统索引提示[第8.9.4节，“索引提示”](index-hints.html).这里列出了新的提示，以及它们的`力指数`或`忽略索引`等价物：

    -   [`群体指数`](optimizer-hints.html#optimizer-hints-index-level)：相当于`按组别划分的部队指数`

        [`无组索引`](optimizer-hints.html#optimizer-hints-index-level)：相当于`忽略分组依据的索引`

    -   [`加入索引`](optimizer-hints.html#optimizer-hints-index-level)：相当于`连接的强制索引`

        [`没有加入索引`](optimizer-hints.html#optimizer-hints-index-level)：相当于`忽略连接的索引`

    -   [`订单指数`](optimizer-hints.html#optimizer-hints-index-level)：相当于`按订单排序的强制索引`

        [`无订单索引`](optimizer-hints.html#optimizer-hints-index-level)：相当于`忽略ORDER BY的索引`

    -   [`指数`](optimizer-hints.html#optimizer-hints-index-level)：与相同[`群体指数`](optimizer-hints.html#optimizer-hints-index-level)加[`加入索引`](optimizer-hints.html#optimizer-hints-index-level)加[`订单指数`](optimizer-hints.html#optimizer-hints-index-level); 相当于`力指数`没有修饰语

         [`无索引`](optimizer-hints.html#optimizer-hints-index-level)：与相同[`无组索引`](optimizer-hints.html#optimizer-hints-index-level)加[`没有加入索引`](optimizer-hints.html#optimizer-hints-index-level)加[`无订单索引`](optimizer-hints.html#optimizer-hints-index-level); 相当于`忽略索引`没有修饰语

        例如，以下两个查询是等效的：

    ```
    SELECT a FROM t1 FORCE INDEX (i_a) FOR JOIN WHERE a=1 AND b=2;

    SELECT /*+ JOIN_INDEX(t1 i_a) */ a FROM t1 WHERE a=1 AND b=2;
    ```

    前面列出的优化器提示遵循与现有索引级优化器提示相同的语法和用法基本规则。

    这些优化器提示旨在取代`力指数`和`忽略索引`，我们计划在未来的MySQL版本中弃用它，然后从MySQL中删除它。它们没有实现一个完全相同的功能`使用索引`; 相反，你可以雇佣一个或多个[`无索引`](optimizer-hints.html#optimizer-hints-index-level), [`没有加入索引`](optimizer-hints.html#optimizer-hints-index-level), [`无组索引`](optimizer-hints.html#optimizer-hints-index-level)或[`无订单索引`](optimizer-hints.html#optimizer-hints-index-level)达到同样的效果。

    有关更多信息和使用示例，请参阅[索引级优化器提示](optimizer-hints.html#optimizer-hints-index-level).

-   **JSON_VALUE（）函数。**MySQL 8.0.21实现了一个新功能[`JSON_值（）`](json-search-functions.html#function_json-value)旨在简化[`JSON`](json.html)柱。在其最基本的形式中，它将JSON文档和指向该文档中单个值的JSON路径作为参数，并且（可选）允许您使用`返回`关键词。`JSON_值(*`json\_文件`*, *`路径`*回归*`类型`*)`相当于：

    ```
    CAST(
        JSON_UNQUOTE( JSON_EXTRACT(json_doc, path) )
        AS type
    );
    ```

    您还可以指定`空荡荡的`, `论错误`，或两个条款，类似于[`JSON_表（）`](json-table-functions.html#function_json-table).

    你可以用`JSON_值（）`在数据库中的表达式上创建索引的步骤`JSON`像这样的专栏：

    ```
    CREATE TABLE t1(
        j JSON,
        INDEX i1 ( (JSON_VALUE(j, '$.id' RETURNING UNSIGNED)) )
    );

    INSERT INTO t1 VALUES ROW('{"id": "123", "name": "shoes", "price": "49.95"}');
    ```

    使用此表达式的查询（如此处所示）可以使用索引：

    ```
    SELECT name, price FROM t1
        WHERE JSON_VALUE(j, '$.id' RETURNING UNSIGNED) = 123;
    ```

    在许多情况下，这比从`JSON`列，然后在生成的列上创建索引。

    有关更多信息和示例，请参见的说明[`JSON_值（）`](json-search-functions.html#function_json-value).

-   **用户评论和用户属性。**MySQL 8.0.21引入了在创建或更新用户帐户时设置用户评论和用户属性的功能。用户注释由作为参数传递给用户的任意文本组成`议论`与a连用的子句[`创建用户`](create-user.html)或[`改变用户`](alter-user.html)陈述用户属性由JSON对象形式的数据组成，作为参数传递给`属性`子句与这两个语句中的任何一个一起使用。该属性可以包含JSON对象表示法中的任何有效键值对。只有一个`议论`或`属性`可以用在一个单一的`创建用户`或`改变用户`陈述

    用户注释和用户属性在内部作为JSON对象存储在一起，注释文本作为元素的值`议论`作为它的钥匙。这些信息可以从`属性`专栏[`信息模式。用户属性`](information-schema-user-attributes-table.html)桌子因为它是JSON格式的，所以可以使用MySQL的JSON函数和运算符来解析它的内容（参见[第12.18节，“JSON函数”](json-functions.html))。用户属性的连续更改将与使用时的当前值合并[`JSON_MERGE_PATCH（）`](json-modification-functions.html#function_json-merge-patch)作用

    例子：

    ```
    mysql> CREATE USER 'mary'@'localhost' COMMENT 'This is Mary Smith\'s account';
    Query OK, 0 rows affected (0.33 sec)

    mysql> ALTER USER 'mary'@'localhost'
        -≫     ATTRIBUTE '{"fname":"Mary", "lname":"Smith"}';
    Query OK, 0 rows affected (0.14 sec)

    mysql> ALTER USER 'mary'@'localhost'
        -≫     ATTRIBUTE '{"email":"mary.smith@example.com"}';
    Query OK, 0 rows affected (0.12 sec)

    mysql> SELECT
        ->    USER,
        ->    HOST,
        ->    ATTRIBUTE->>"$.fname" AS 'First Name',
        ->    ATTRIBUTE->>"$.lname" AS 'Last Name',
        ->    ATTRIBUTE->>"$.email" AS 'Email',
        ->    ATTRIBUTE->>"$.comment" AS 'Comment'
        -> FROM INFORMATION_SCHEMA.USER_ATTRIBUTES
        -> WHERE USER='mary' AND HOST='localhost'\G
    *************************** 1. row ***************************
          USER: mary
          HOST: localhost
    First Name: Mary
     Last Name: Smith
         Email: mary.smith@example.com
       Comment: This is Mary Smith's account
    1 row in set (0.00 sec)
    ```

    有关更多信息和示例，请参阅[第13.7.1.3节“创建用户声明”](create-user.html), [第13.7.1.1节“更改用户声明”](alter-user.html)和[第26.3.46节，“信息\_模式用户\_“属性表”](information-schema-user-attributes-table.html).

-   **新优化器\_切换标志。**MySQL 8.0.21为[`优化器_开关`](server-system-variables.html#sysvar_optimizer_switch)系统变量，如下表所述：

    -   [`更喜欢排序索引`](switchable-optimizations.html#optflag_prefer-ordering-index)旗帜

        默认情况下，MySQL会尝试对任何`订购人`或`分组`具有`限度`子句，只要优化器确定这将导致更快的执行。因为在某些情况下，为这样的查询选择不同的优化实际上执行得更好，所以现在可以通过设置[`更喜欢排序索引`](switchable-optimizations.html#optflag_prefer-ordering-index)向`关`.

        此标志的默认值为`在…上`.

    -   [`子查询_到_派生`](switchable-optimizations.html#optflag_subquery-to-derived)旗帜

        当此标志设置为`在…上`，优化器将符合条件的标量子查询转换为派生表上的联接。例如，查询`从t1中选择*其中t1。a>（从t2中选择计数（a）`被改写为`选择t1。a从t1连接（选择COUNT（t2.a）作为t2中的c）作为d，其中t1。a>d.c`.

        这种优化可以应用于子查询，它是`选择`, `哪里`, `参加`或`有`条款包含一个或多个聚合函数，但不包含`分组`条款不相关；不使用任何不确定函数。

        优化还可以应用于表子查询，它是`在里面`, `不在`, `存在`或`不存在`，且不包含`分组`.例如，查询`从t1中选择*其中t1。b<0或t1。a输入（从t2中选择t2.a+1）`被改写为`从t1左连接中选择a，b（从t2中选择不同的1作为e1，从t2中选择a作为e2）在t1上选择d。a+1=d.e2，其中t1。b<0或d.e1不为空`.

        从MySQL 8.0.24开始，这种优化也可以应用于相关标量子查询，方法是对其应用额外的分组，然后在提升的谓词上应用外部联接。例如，一个查询，如`选择*FROM t1 WHERE（从t2中选择a，其中t2.a=t1.a）>0`可以重写为`选择t1。*从t1左外连接（选择a，将（*）从t2组计数为ct，由a）从t1导出。a=衍生的。a从何而来。a>0`.MySQL执行基数检查以确保子查询不会返回多行([`ER_子查询_NO_1_行`](https://dev.mysql.com/doc/mysql-errors/8.0/en/server-error-reference.html#error_er_subquery_no_1_row)).看到了吗[第13.2.11.7节，“相关子查询”](correlated-subqueries.html)，以获取更多信息。

        这种优化通常被禁用，因为在大多数情况下，它不会产生明显的性能优势；旗帜被设置为`关`默认情况下。

        有关更多信息，请参阅[第8.9.2节，“可切换优化”](switchable-optimizations.html).另见[第8.2.1.19节，“限额查询优化”](limit-optimization.html), [第8.2.2.1节，“使用半连接转换优化IN和EXISTS子查询谓词”](semijoins.html)和[第8.2.2.4节，“通过合并或物化优化派生表、视图引用和公共表表达式”](derived-table-optimization.html).

-   **XML增强。**从MySQL 8.0.21开始[`加载XML`](load-xml.html)声明现在支持`CDATA`要导入的XML中的节。

-   **转换为现在支持的年份类型。**从MySQL 8.0.22开始，服务器允许强制转换[`年`](year.html).两个[`演员阵容`](cast-functions.html#function_cast)和[`CONVERT（）`](cast-functions.html#function_convert)函数支持一位数、两位数和四位数`年`价值观对于一位数和两位数的值，允许的范围为0-99。四位数的值必须在1901-2155之间。`年`也可以用作[`JSON_值（）`](json-search-functions.html#function_json-value)作用此函数仅支持四位数年份。

    字符串、时间和日期以及浮点值都可以强制转换为`年`.铸造[`几何学`](spatial-type-overview.html)价值观`年`不支持。

    有关更多信息（包括转换规则），请参见[`CONVERT（）`](cast-functions.html#function_convert)作用

-   **以UTC格式检索时间戳值。**MySQL 8.0.22及更高版本支持[`时间戳`](datetime.html)从系统时区到UTC的列值[`约会时间`](datetime.html)关于检索，使用`投下(*`价值`*在时区*`说明符`*作为日期时间）`，其中说明符是`[间歇]“+00:00”`或`“UTC”`.测量的精确度`约会时间`如果需要，cast返回的值最多可以指定为6位小数。这个`大堆`此构造不支持关键字。

    `时间戳`还支持使用时区偏移插入表中的值。使用`在时区`不支持[`CONVERT（）`](cast-functions.html#function_convert)或任何其他MySQL函数或构造。

    有关更多信息和示例，请参阅[`演员阵容`](cast-functions.html#function_cast)作用

-   **转储文件输出同步。**MySQL 8.0.22及更高版本支持用户写入文件时的定期同步[`选择到转储文件中`](select-into.html)和`选择输出文件`声明。这可以通过设置[`选择_进入_磁盘_同步`](server-system-variables.html#sysvar_select_into_disk_sync)系统变量为`在…上`; 写入缓冲区的大小由为[`在缓冲区大小中选择`](server-system-variables.html#sysvar_select_into_buffer_size); 默认值为131072（2<sup>17</sup>)字节。

    此外，同步到磁盘后的可选延迟可以使用[`选择进入磁盘同步延迟`](server-system-variables.html#sysvar_select_into_disk_sync_delay); 默认值为无延迟（0毫秒）。

    有关更多信息，请参阅本项目前面引用的变量说明。

-   **单一的陈述准备。**从MySQL 8.0.22开始，prepared语句只准备了一次，而不是每次执行一次。这是在执行时完成的[`准备`](prepare.html)。存储过程中的任何语句也是如此；当存储过程第一次执行时，语句准备一次。

    这种变化的一个结果是，预处理语句中使用的动态参数的解析方式也发生了变化，如下所示：

    -   在准备语句时，为准备好的语句参数指定了数据类型；该类型在语句的每次后续执行中都会保持不变（除非重新编写该语句；请参见下文）。

        在准备好的语句中为给定参数或用户变量使用不同的数据类型，以便在第一次执行之后执行该语句，可能会导致该语句被重新准备；因此，在重新执行准备好的语句时，建议对给定参数使用相同的数据类型。

    -   为了符合SQL标准，不再接受使用窗口函数的以下构造：

        -   [`NTILE（空）`](window-function-descriptions.html#function_ntile)

        -   [`n_值(*`expr`*，空）`](window-function-descriptions.html#function_nth-value)

        -   [`引导(*`expr`*, *`nn`*)`](window-function-descriptions.html#function_lead)和[`落后（*`表达式`*, *`nn`*)`](window-function-descriptions.html#function_lag)， 在哪里*`nn`*是负数

            这有助于更好地遵守 SQL 标准。有关详细信息，请参阅各个功能说明。

    -   在准备好的语句中引用的用户变量现在在准备语句时确定其数据类型；该类型在语句的每个后续执行中都保持不变。

    -   由存储过程中发生的语句引用的用户变量现在在第一次执行语句时确定其数据类型；对于包含存储过程的任何后续调用，该类型仍然存在。

    -   执行表单的准备好的语句时`选择 *`expr1`*, *`expr2`*， ... 从 *`桌子`* 订购？`，传递一个整数值*`ñ`*因为参数不再导致结果的排序*`ñ`*<sup>th</sup>选择列表中的表达式；结果不再排序，正如预期的那样`订购人 *`持续的`*`.

        将用作预准备语句或在存储过程中的语句仅准备一次可以提高语句的性能，因为它抵消了重复准备的额外成本。这样做还可以避免准备结构的多次回滚，这是 MySQL 中许多问题的根源。

        有关详细信息，请参阅[第 13.5.1 节，“准备声明”](prepare.html).

-   **RIGHT JOIN 作为 LEFT JOIN 处理。**从 MySQL 8.0.22 开始，服务器处理所有的实例`正确加入`内部作为`左连接`，消除了在解析时未执行完整转换的一些特殊情况。

-   **派生条件下推优化。**MySQL 8.0.22（及更高版本）为具有物化派生表的查询实现派生条件下推。对于查询，例如`SELECT * FROM (SELECT i, j FROM t1) AS dt WHERE i > *`持续的`*`，现在在很多情况下可以推外`在哪里`条件到派生表，在这种情况下导致`SELECT * FROM (SELECT i, j FROM t1 WHERE i > *`持续的`*) 作为 dt`.

    以前，如果派生表已物化且未合并，则 MySQL 会物化整个表，然后使用`在哪里`健康）状况。移动`在哪里`使用派生条件下推优化条件进入子查询通常可以减少必须处理的行数，从而可以减少执行查询所需的时间。

    一个外`在哪里`当派生表不使用任何聚合或窗口函数时，可以将条件直接下推到具体化派生表。当派生表有一个`通过...分组`并且不使用任何窗口函数，外部`在哪里`条件可以下推到派生表中`拥有`健康）状况。这`在哪里`当派生表使用窗口函数并且外部`在哪里`引用窗口函数中使用的列`划分`条款。

    默认情况下启用派生条件下推，如[`优化器开关`](server-system-variables.html#sysvar_optimizer_switch)系统变量[`派生条件下推`](switchable-optimizations.html#optflag_derived-condition-pushdown)旗帜。MySQL 8.0.22 中添加的标志设置为`在`默认;要禁用特定查询的优化，您可以使用[`NO_DERIVED_CONDITION_PUSHDOWN`](optimizer-hints.html#optimizer-hints-table-level)优化器提示（也在 MySQL 8.0.22 中添加）。如果由于以下原因禁用优化[`派生条件下推`](switchable-optimizations.html#optflag_derived-condition-pushdown)被设置为`离开`，您可以使用给定查询启用它[`DERIVED_CONDITION_PUSHDOWN`](optimizer-hints.html#optimizer-hints-table-level).

    派生条件下推优化不能用于包含`限制`条款。在 MySQL 8.0.29 之前，当查询包含时也不能使用优化[`联盟`](union.html).在 MySQL 8.0.29 及更高版本中，大多数情况下条件可以下推到联合的两个查询块；看[第 8.2.2.5 节，“导出条件下推优化”](derived-condition-pushdown-optimization.html)， 了解更多信息。

    另外，本身使用子查询的条件不能下推，`在哪里`不能将条件下推到同时是外连接的内表的派生表。有关其他信息和示例，请参阅[第 8.2.2.5 节，“导出条件下推优化”](derived-condition-pushdown-optimization.html).

-   **MySQL 授权表上的非锁定读取。**从 MySQL 8.0.22 开始，为了允许对 MySQL 授权表进行并发 DML 和 DDL 操作，以前在 MySQL 授权表上获得行锁的读取操作将作为非锁定读取执行。

    现在在 MySQL 授权表上作为非锁定读取执行的操作包括：

    -   [`选择`](select.html)通过连接列表和子查询从授权表中读取数据的语句和其他只读语句，包括[`选择...分享`](innodb-locking-reads.html)语句，使用任何事务隔离级别。

    -   使用任何事务隔离级别从授权表（通过连接列表或子查询）读取数据但不修改它们的 DML 操作。

        有关其他信息，请参阅[授予表并发](grant-tables.html#grant-tables-concurrency).

-   **对 FROM 的 64 位支持\_UNIXTIME(), UNIX\_时间戳（），转换\_TZ()。**从 MySQL 8.0.28 开始，函数[`FROM_UNIXTIME()`](date-and-time-functions.html#function_from-unixtime),[`UNIX_TIMESTAMP()`](date-and-time-functions.html#function_unix-timestamp)， 和[`转换_TZ()`](date-and-time-functions.html#function_convert-tz)在支持它们的平台上处理 64 位值。这包括 64 位版本的 Linux、MacOS 和 Windows。

    在兼容的平台上，`UNIX_TIMESTAMP()`现在处理的值高达`'3001-01-18 23:59:59.999999'`世界标准时间，和`FROM_UNIXTIME()`可以转换自 Unix 纪元以来最多 32536771199.999999 秒的值；`转换_TZ()`现在接受不超过的值`'3001-01-18 23:59:59.999999'`转换后的 UTC。

    这些函数在 32 位平台上的行为不受这些更改的影响。的行为[`时间戳`](datetime.html)类型也不受影响（在任何平台上）；用于处理之后的日期时间`'2038-01-19 03:14:07.999999'`, UTC, 使用[`约会时间`](datetime.html)而是键入。

    有关更多信息，请参阅刚刚讨论的各个功能的描述，在[第 12.7 节，“日期和时间函数”](date-and-time-functions.html).

-   **资源分配控制。**从 MySQL 8.0.28 开始，您可以通过检查所有普通用户发出的查询使用的内存量[`全局连接内存`](server-status-variables.html#statvar_Global_connection_memory)状态变量。（这个总数不包括系统用户使用的资源，例如MySQL root。它还不包括用户占用的任何内存。）[`InnoDB`](innodb-storage-engine.html)缓冲池。）

    要启用的更新`全局连接内存`，有必要设置[`全局连接内存跟踪=1`](server-system-variables.html#sysvar_global_connection_memory_tracking); 这是`0`（关闭）默认情况下。你可以控制频率`全局连接内存`通过设置进行更新[`连接\内存\块\大小`](server-system-variables.html#sysvar_connection_memory_chunk_size).

    通过设置此处列出的任一或两个系统变量，也可以在会话或全局级别或两者上为普通用户设置内存使用限制：

    -   [`连接\内存\限制`](server-system-variables.html#sysvar_connection_memory_limit)：为每个连接分配的内存量。任何用户超过此限制时，都会拒绝来自此用户的新查询。

    -   [`全局连接内存限制`](server-system-variables.html#sysvar_global_connection_memory_limit)：为所有连接分配的内存量。一旦超过此限制，任何普通用户的新查询都会被拒绝。

        这些限制不适用于系统进程或管理帐户。

        有关更多信息，请参阅引用变量的描述。

-   **分离XA事务。**MySQL 8.0.29增加了对XA事务的支持，这些事务一旦准备好，就不再连接到原始连接。这意味着它们可以由另一个连接提交或回滚，并且当前会话可以立即开始另一个事务。

    系统变量[`xa_分离_上_准备`](server-system-variables.html#sysvar_xa_detach_on_prepare)控制XA事务是否分离；默认值是`在…上`，这将导致分离所有XA事务。有效时，XA事务不允许使用临时表。

    有关更多信息，请参阅[第13.3.8.2节，“XA事务状态”](xa-states.html).

-   **自动二进制日志清除控制。**MySQL 8.0.29增加了[`binlog\u过期\u日志\u自动\u清除`](replication-options-binary-log.html#sysvar_binlog_expire_logs_auto_purge)系统变量，它为启用和禁用二进制日志的自动清除提供了一个接口。这是启用的(`在…上`)默认情况下；要禁用二进制日志文件的自动清除，请将此变量设置为`关`.

    `binlog\u过期\u日志\u自动\u清除`必须是`在…上`以便继续自动清除二进制日志文件；此变量的值优先于任何其他服务器选项或变量的值，包括（但不限于）[`binlog_过期_日志_秒`](replication-options-binary-log.html#sysvar_binlog_expire_logs_seconds).

    设置`binlog\u过期\u日志\u自动\u清除`对…没有影响[`清除二进制日志`](purge-binary-logs.html).

-   **条件例程和触发器创建语句。**从MySQL 8.0.29开始，以下语句支持`如果不存在`选项：

    -   [`创建函数`](create-function.html)

    -   [`创建过程`](create-procedure.html)

    -   [`创建触发器`](create-trigger.html)

        对于`创建函数`创建存储函数时`创建过程`，如果已经存在同名的例程，则此选项可防止发生错误。对于[`创建函数`](create-function-loadable.html)当用于创建可加载函数时，如果已经存在具有该名称的可加载函数，则该选项可防止出现错误。对于`创建触发器`，如果同一架构和同一表中已经存在同名触发器，则该选项可防止发生错误。

        这种增强使这些语句的语法与[`创建数据库`](create-database.html), [`创建表格`](create-table.html), [`创建用户`](create-user.html)和[`创建事件`](create-event.html)（所有这些都已经支持`如果不存在`)，并对`如果存在`支持的选项[`丢弃程序`](drop-procedure.html), [`下降函数`](drop-function.html)和[`扳机`](drop-trigger.html)声明。

        有关更多信息，请参阅所示SQL语句的描述，以及[函数名解析](function-resolution.html#function-name-resolution).另见[第17.5.1.7节，“复制CREATE TABLE…SELECT语句”](replication-features-create-select.html).

### MySQL 8.0中不推荐的功能

[](<>)[](<>)

以下功能在MySQL 8.0中已被弃用，并可能在未来的系列中删除。如果显示了替代方案，则应更新应用程序以使用它们。

对于使用MySQL 8.0中不推荐的功能并已在更高的MySQL系列中删除的应用程序，当从MySQL 8.0源复制到更高的系列副本时，语句可能会失败，或者可能会对源和副本产生不同的影响。为了避免此类问题，应该对使用8.0中不推荐的功能的应用程序进行修改，以避免这些功能，并在可能的情况下使用其他功能。

-   这个`utf8mb3`字符集已弃用。请使用`utf8mb4`相反

    [](<>)[](<>)

-   以下字符集已弃用：

    [](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

    -   `ucs2`（见[第10.9.4节，“ucs2字符集（UCS-2 Unicode编码）”](charset-unicode-ucs2.html))

    -   `马克罗曼`和`麦切`（见[第10.10.2节，“西欧字符集”](charset-we-sets.html)和[第10.10.3节，“中欧字符集”](charset-ce-sets.html))

    -   `12月`（见[第10.10.2节，“西欧字符集”](charset-we-sets.html))

    -   `hp8`（见[第10.10.2节，“西欧字符集”](charset-we-sets.html))

        在MySQL 8.0.28及更高版本中，当以以下任一方式使用这些字符集或其排序规则时，都会生成一个弃用警告：

    -   当启动MySQL服务器时[`--字符集服务器`](server-system-variables.html#sysvar_character_set_server)或[`--排序服务器`](server-system-variables.html#sysvar_collation_server)

    -   在任何SQL语句中指定时，包括但不限于[`创建表格`](create-table.html), [`创建数据库`](create-database.html), [`定名`](set-names.html)和[`改变桌子`](alter-table.html)

        你应该使用`utf8mb4`而不是前面列出的任何字符集。

-   因为`缓存_sha2_密码`是MySQL 8.0中的默认身份验证插件，提供了`shau密码`身份验证插件，`shau密码`不赞成；预计它将在MySQL的未来版本中被删除。使用`shau密码`应该迁移使用`缓存_sha2_密码`相反

    [](<>)[](<>)

-   这个`验证密码`插件已经重新实现，以使用组件基础设施。的插件形式`验证密码`仍然可用，但现在已弃用；预计它将在MySQL的未来版本中被删除。使用该插件的MySQL安装应该过渡到使用该组件。看见[第6.4.3.3节，“转换到密码验证组件”](validate-password-transitioning.html).

    [](<>)[](<>)

-   这个`发动机`合同条款[`改变表空间`](alter-tablespace.html)和[`删除表空间`](drop-tablespace.html)不推荐使用语句。

    [](<>)[](<>)

-   这个[`PAD_CHAR_至_全长`](sql-mode.html#sqlmode_pad_char_to_full_length)不推荐使用SQL模式。

    [](<>)[](<>)

-   `自动增量`不推荐支持类型为的列[`浮动`](floating-point-types.html)和[`双重的`](floating-point-types.html)（以及任何同义词）。考虑移除`自动增量`属性，或将其转换为整数类型。

    [](<>)[](<>)

-   这个`未签名`属性不推荐用于类型为的列[`浮动`](floating-point-types.html), [`双重的`](floating-point-types.html)和[`十进制的`](fixed-point-types.html)（以及任何同义词）。考虑使用简单的`检查`而不是为此类列设置约束。

    [](<>)[](<>)

-   `漂浮(*`M`*,*`D`*)`和`加倍(*`M`*,*`D`*)`指定类型列的位数的语法[`浮动`](floating-point-types.html)和[`双重的`](floating-point-types.html)（以及任何同义词）是一个非标准的MySQL扩展。此语法已被弃用。

    [](<>)[](<>)

-   这个`零填充`对于数值数据类型，属性是不推荐的，对于整型数据类型，显示宽度属性也是不推荐的。考虑使用一种替代方法来产生这些属性的效果。例如，应用程序可以使用[`LPAD（）`](string-functions.html#function_lpad)函数将焊盘编号归零至所需的宽度，也可以将格式化后的数字存储在[`烧焦`](char.html)柱。

-   对于字符串数据类型`二进制的`属性是一个非标准的MySQL扩展，是指定二进制文件的缩写(`_垃圾箱`)列字符集（如果未指定列字符集，则为表默认字符集）的排序规则。在MySQL 8.0中，这种非标准的`二进制的`因为`utf8mb4`字符集有多个`_垃圾箱`排序规则，所以`二进制的`属性已弃用；预计MySQL的未来版本将删除对它的支持。应用程序应该调整为使用显式`_垃圾箱`而不是排序。

    [](<>)[](<>)

    使用`二进制的`指定数据类型或字符集的步骤保持不变。

-   MySQL的早期版本支持非标准的速记表达式`ASCII码`和`UNICODE`分别为`拉丁字符集1`和`字符集ucs2`. `ASCII码`和`UNICODE`已弃用（MySQL 8.0.28及更高版本），现在生成警告。使用`字符集`相反，在这两种情况下。

    [](<>)[](<>)[](<>)[](<>)

-   非标准C风格[`&&`](logical-operators.html#operator_and), [`||`](logical-operators.html#operator_or)和[`!`](logical-operators.html#operator_not)是标准SQL的同义词的运算符[`和`](logical-operators.html#operator_and), [`或`](logical-operators.html#operator_or)和[`不`](logical-operators.html#operator_not)分别不推荐使用运算符。使用非标准运算符的应用程序应调整为使用标准运算符。

    [](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

    笔记

    使用[`||`](logical-operators.html#operator_or)除非[`管道`](sql-mode.html#sqlmode_pipes_as_concat)SQL模式已启用。那样的话`||`表示SQL标准字符串连接运算符）。

-   这个[`JSON_MERGE（）`](json-modification-functions.html#function_json-merge)函数已弃用。使用[`JSON_MERGE_PRESERVE（）`](json-modification-functions.html#function_json-merge-preserve)相反

    [](<>)[](<>)

-   这个`SQL\u计算\u找到\u行`查询修饰符和伴随[`找到_行（）`](information-functions.html#function_found-rows)函数已弃用。看到了吗[`找到_行（）`](information-functions.html#function_found-rows)关于替代策略的信息说明。

    [](<>)[](<>)[](<>)[](<>)

-   支持`TABLESPACE=innodb_file_per_table`和`表空间=innodb_临时`带有[`创建临时表`](create-table.html)从MySQL 8.0.13开始就不推荐使用。

    [](<>)[](<>)

-   对于[`选择`](select.html)声明，使用`进入`后面的条款`从…起`但不是在最后[`选择`](select.html)从MySQL 8.0.20开始就不推荐使用。最好将`进入`在声明的最后。

    对于[`协会`](union.html)语句，这两个变体包含`进入`从MySQL 8.0.20开始，已弃用：

    -   在查询表达式的尾部查询块中，使用`进入`之前`从…起`.

    -   在查询表达式的带括号的尾部块中，使用`进入`，而不考虑其相对于`从…起`.

        看见[第13.2.10.1节，“选择……进入报表”](select-into.html)和[第13.2.10.3节“工会条款”](union.html).

    [](<>)[](<>)[](<>)[](<>)

-   [`同花顺的主人`](flush.html#flush-hosts)从MySQL 8.0.23开始就不推荐使用。相反，截断性能模式[`主机缓存`](performance-schema-host-cache-table.html)表：

    ```
    TRUNCATE TABLE performance_schema.host_cache;
    ```

    这个[`截断表`](truncate-table.html)操作需要[`滴`](privileges-provided.html#priv_drop)这张桌子的特权。

-   这个[**mysql\_升级**](mysql-upgrade.html)客户端已被弃用，因为它具有升级中的系统表的功能`mysql`系统模式和其他模式中的对象已移动到MySQL服务器中。看见[第2.11.3节，“MySQL升级过程升级了什么”](upgrading-what-is-upgraded.html).

    [](<>)[](<>)

-   这个[`--无dd升级`](server-options.html#option_mysqld_no-dd-upgrade)不推荐使用服务器选项。它被[`--升级`](server-options.html#option_mysqld_upgrade)选项，可以更好地控制数据字典和服务器升级行为。

    [](<>)[](<>)

-   这个`mysql\u升级\u信息`不推荐使用创建数据目录并用于存储MySQL版本号的文件；预计它将在MySQL的未来版本中被删除。

    [](<>)[](<>)

-   这个`中继日志信息文件`系统变量和`--主信息文件`选项已被弃用。以前，它们用于指定中继日志信息日志和源信息日志的名称[`中继日志信息存储库=文件`](replication-options-replica.html#sysvar_relay_log_info_repository)和[`master_info_repository=文件`](replication-options-replica.html#sysvar_master_info_repository)已设置，但这些设置已被弃用。中继日志信息日志和源信息日志文件的使用已被崩溃安全副本表取代，这是MySQL 8.0中的默认值。

    [](<>)[](<>)[](<>)[](<>)

-   这个[`排序数据的最大长度`](server-system-variables.html#sysvar_max_length_for_sort_data)系统变量现在不推荐使用，因为优化器的更改使其过时且无效。

    [](<>)[](<>)

-   不推荐使用这些用于压缩服务器连接的旧参数：[`--压缩`](connection-options.html#option_general_compress)客户端命令行选项；这个`MYSQL_OPT_COMPRESS`选择[`mysql_选项（）`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-options.html)C API函数；这个[`slave_压缩_协议`](replication-options-replica.html#sysvar_slave_compressed_protocol)系统变量。有关要改用的参数的信息，请参见[第4.2.8节，“连接压缩控制”](connection-compression-control.html).

    [](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

-   使用`MYSQL_PWD`不推荐使用指定MySQL密码的环境变量。

    [](<>)[](<>)

-   使用[`价值观（）`](miscellaneous-functions.html#function_values)在中访问新行值的步骤[`插入关于重复密钥更新`](insert-on-duplicate.html)从MySQL 8.0.20开始就不推荐使用。而是为新行和新列使用别名。

    [](<>)[](<>)[](<>)[](<>)

-   因为`论错误`之前`空荡荡的`当调用[`JSON_表（）`](json-table-functions.html#function_json-table)与SQL标准相反，这种语法现在在MySQL中被弃用。从MySQL 8.0.20开始，每当您尝试这样做时，服务器都会打印一条警告。在一个文件中指定这两个条款时`JSON_表（）`调用，确保`空荡荡的`首先使用。

    [](<>)[](<>)

-   带有索引前缀的列从未被支持作为表分区键的一部分；以前，在创建、更改或升级分区表时，这些都是允许的，但被表的分区功能排除在外，并且服务器没有发出发生这种情况的警告。这种许可行为现在已被弃用，并可能在MySQL的未来版本中被删除，在该版本中，在分区键中使用任何此类列都会导致[`创建表格`](create-table.html)或[`改变桌子`](alter-table.html)他们的声明被拒绝了。

    从MySQL 8.0.21开始，每当使用索引前缀的列被指定为分区键的一部分时，就会为每个这样的列生成警告。每当[`创建表格`](create-table.html)或[`改变桌子`](alter-table.html)语句被拒绝，因为建议的分区键中的所有列都会有索引前缀，因此产生的错误现在提供了拒绝的确切原因。在这两种情况下，都包括分区函数中使用的列通过使用空`按键划分（）`条款

    有关更多信息和示例，请参阅[键分区不支持列索引前缀](partitioning-limitations.html#partitioning-limitations-prefixes).

    [](<>)[](<>)

-   InnoDB memcached插件从MySQL 8.0.22开始就被弃用；预计MySQL的未来版本将删除对它的支持。

    [](<>)[](<>)

-   这个[`诱人的_使用_mmap`](server-system-variables.html#sysvar_temptable_use_mmap)从MySQL 8.0.26开始，变量已被弃用；预计MySQL的未来版本将删除对它的支持。

    [](<>)[](<>)

-   这个[`二进制的`](cast-functions.html#operator_binary)从MySQL 8.0.27开始，operator就被弃用了，您应该期待它在MySQL的未来版本中被删除。使用`二进制的`现在会引起一个警告。使用[`强制转换（…作为二进制）`](cast-functions.html#function_cast)相反

    [](<>)[](<>)

-   这个[`默认认证插件`](server-system-variables.html#sysvar_default_authentication_plugin)从MySQL 8.0.27开始，变量已被弃用；预计MySQL的未来版本将删除对它的支持。

    这个[`默认认证插件`](server-system-variables.html#sysvar_default_authentication_plugin)变量仍在MySQL 8.0.27中使用，但与新版本结合使用，且优先级低于新版本`身份验证策略`系统变量，在MySQL 8.0.27中引入了多因素身份验证功能。有关详细信息，请参阅[默认的身份验证插件](pluggable-authentication.html#pluggable-authentication-default-plugin).

    [](<>)[](<>)

-   这个[`--中止从属事件计数`](replication-options-replica.html#option_mysqld_abort-slave-event-count)和[`--断开从属事件计数`](replication-options-replica.html#option_mysqld_disconnect-slave-event-count)从MySQL 8.0.29开始，MySQL测试套件使用的、通常不用于生产的服务器选项已被弃用；预计这两个选项都将在MySQL的未来版本中删除。

    [](<>)[](<>)[](<>)[](<>)

-   这个[`myisam_修复_螺纹`](server-system-variables.html#sysvar_myisam_repair_threads)系统变量和[**myisamchk**](myisamchk.html) [`--并行恢复`](myisamchk-repair-options.html#option_myisamchk_parallel-recover)从MySQL 8.0.29开始，选项已被弃用；在MySQL的未来版本中，这两种支持都将被删除。

    在MySQL 8.0.29中，除1（默认值）之外的值[`myisam_修复_螺纹`](server-system-variables.html#sysvar_myisam_repair_threads)发出警告。

    [](<>)[](<>)[](<>)[](<>)

-   之前，MySQL接受了[`日期`](datetime.html), [`时间`](time.html), [`约会时间`](datetime.html)和[`时间戳`](datetime.html)包含任意数量（任意）分隔符字符的文字，以及`约会时间`和`时间戳`在日期和时间部分之前、之后以及之间具有任意数量的空白字符的文本。从MySQL 8.0.29开始，每当文本值包含以下任何一项时，服务器都会发出不推荐警告：

    -   一个或多个非标准分隔符字符

    -   多余的分隔符字符

    -   除空格字符（“”，`0x20`)

    -   多余空格字符

        即使存在多个问题，每个时态值也会发出一个弃用警告。在严格模式下，此警告不会升级为错误，因此执行[`插入`](insert.html)当严格模式生效时，这样的值仍然成功。

        您应该期望在MySQL的未来版本中删除非标准行为，现在就采取措施确保您的应用程序不依赖它。

        看见[日期和时间上下文中的字符串和数字文本](date-and-time-literals.html#date-and-time-string-numeric-literals)，以获取更多信息和示例。

    [](<>)[](<>)[](<>)[](<>)

-   这个[`副本\u并行\u类型`](replication-options-replica.html#sysvar_replica_parallel_type)系统变量及其关联的服务器选项`--副本并行类型`从MySQL 8.0.29开始就不推荐使用。从本版本开始，读取或设置此值会引发弃用警告；预计它将在MySQL的未来版本中被删除。

    [](<>)[](<>)

-   这个[`--跳过主机缓存`](server-options.html#option_mysqld_skip-host-cache)从MySQL 8.0.30开始，服务器选项已被弃用；预计它将在未来的MySQL版本中删除。使用[`主机缓存大小`](server-system-variables.html#sysvar_host_cache_size)而是系统变量。

    [](<>)[](<>)

### MySQL 8.0中删除的功能

[](<>)[](<>)

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

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

-   这个`innodb_为_binlog锁定_unsafe_`系统变量已删除。这个[`阅读承诺`](innodb-transaction-isolation-levels.html#isolevel_read-committed)隔离级别提供了类似的功能。

    [](<>)[](<>)

-   这个`信息_模式_统计`MySQL 8.0.0中引入的变量被删除并替换为[`信息_模式_统计_到期`](server-system-variables.html#sysvar_information_schema_stats_expiry)在MySQL 8.0.3中。

    [](<>)[](<>)

    `信息_模式_统计_到期`定义缓存的过期设置[`信息模式`](information-schema.html)表格统计。有关更多信息，请参阅[第8.2.3节，“优化信息\_“模式查询”](information-schema-optimization.html).

-   与废弃设备相关的代码`InnoDB`MySQL 8.0.3中删除了系统表。[`信息模式`](information-schema.html)基于`InnoDB`系统表被数据字典表上的内部系统视图替换。影响`InnoDB` [`信息模式`](information-schema.html)视图被重命名为：

    [](<>)

    **表1.1重命名的InnoDB信息模式视图**

    | 老名字 | 新名字 |
    | --- | --- |
    | `INNODB_系统_列` | `INNODB_列` |
    | `INNODB_系统_数据文件` | `INNODB_数据文件` |
    | `INNODB_系统_字段` | `INNODB_字段` |
    | `INNODB_SYS_FOREIGN` | `INNODB_FOREIGN` |
    | `INNODB_SYS_FOREIGN_COLS` | `INNODB_FOREIGN_COLS` |
    | `INNODB_系统索引` | `INNODB_索引` |
    | `INNODB_系统_表` | `INNODB_表` |
    | `INNODB_SYS_表空间` | `INNODB_表空间` |
    | `INNODB_系统_表状态` | `INNODB_表状态` |
    | `INNODB_系统_虚拟` | `INNODB_虚拟` |

    [](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

    升级到MySQL 8.0.3或更高版本后，更新引用以前版本的所有脚本`InnoDB` [`信息模式`](information-schema.html)查看名称。

-   已删除与帐户管理相关的以下功能：

    -   使用[`授予`](grant.html)创建用户。相反，使用[`创建用户`](create-user.html).遵循这种做法会使`无自动创建用户`SQL模式对于[`授予`](grant.html)语句，因此它也被删除，并且当`sql_模式`选项文件中的选项可防止[**mysqld**](mysqld.html)从一开始。

        [](<>)[](<>)

    -   使用[`授予`](grant.html)修改权限分配以外的帐户属性。这包括身份验证、SSL和资源限制属性。相反，在创建帐户时使用[`创建用户`](create-user.html)或者之后用[`改变用户`](alter-user.html).

    -   `由密码'*`验证字符串`*'`语法[`创建用户`](create-user.html)和[`授予`](grant.html).相反，使用`认同*`auth\_插件`*就像*`验证字符串`*'`对于[`创建用户`](create-user.html)和[`改变用户`](alter-user.html)，在哪里`'*`验证字符串`*'`值的格式与指定的插件兼容。

        [](<>)[](<>)

        此外，因为`通过密码识别`语法被删除了`以密码识别的方式记录内置信息`系统变量是多余的，已删除。

        [](<>)[](<>)

    -   这个`密码（）`作用此外，`密码（）`移除意味着[`设置密码…=密码（'*`验证字符串`*')`](set-password.html)语法不再可用。

        [](<>)[](<>)

    -   这个`旧密码`系统变量。

        [](<>)[](<>)

-   已删除查询缓存。移除包括以下项目：

    [](<>)[](<>)

    -   这个`刷新查询缓存`和`重置查询缓存`声明。

        [](<>)[](<>)[](<>)[](<>)

    -   这些系统变量：`查询缓存限制`, `查询缓存最小存储单元`, `查询缓存大小`, `查询缓存类型`, `查询\u缓存\u锁定\u无效`.

        [](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

    -   这些状态变量：`Qcache_free_块`, `Qcache_free_内存`, `Qcache_点击率`, `Qcache_插件`, `Qcache_lowmem_李子`, `Qcache_not_cached`, `Qcache_查询_缓存中的_`, `Qcache_总块数`.

        [](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

    -   这些线程声明：`检查缓存查询的权限`, `正在检查查询缓存以进行查询`, `使查询缓存项无效`, `将缓存结果发送到客户端`, `将结果存储在查询缓存中`, `正在等待查询缓存锁定`.

        [](<>)[](<>)

    -   这个`SQL_缓存` [`选择`](select.html)修饰语。

         [](<>)[](<>)

        这些不推荐使用的查询缓存项仍然不推荐使用，但没有效果；希望在未来的MySQL版本中删除它们：

    -   这个`SQL_NO_缓存` [`选择`](select.html)修饰语。

    -   这个`ndb_缓存_检查_时间`系统变量。

        这个`有_查询_缓存`系统变量仍然不推荐使用，并且始终具有值`不`; 预计它将在未来的MySQL版本中被删除。

-   数据字典提供有关数据库对象的信息，因此服务器不再检查数据目录中的目录名以查找数据库。因此`--忽略数据库目录`选项和`忽略_db_dirs`系统变量是无关的，将被删除。

    [](<>)[](<>)[](<>)[](<>)

-   DDL日志（也称为元数据日志）已被删除。从MySQL 8.0.3开始，这个功能由数据字典处理`innodb_ddl_日志`桌子看见[查看DDL日志](atomic-ddl.html#atomic-ddl-view-logs).

-   这个`tx_隔离`和`tx_只读`系统变量已被删除。使用`事务隔离`和`事务_只读`相反

    [](<>)[](<>)[](<>)[](<>)

-   这个`同步`系统变量已被删除，因为`.frm`文件已经过时。

    [](<>)[](<>)

-   这个`安全认证`系统变量和`--安全认证`客户端选项已被删除。这个`MYSQL\u安全\u身份验证`选择[`mysql_选项（）`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-options.html)C API函数被删除。

    [](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

-   这个`多量程计数`系统变量被删除。

    [](<>)[](<>)

-   这个`日志警告`系统变量和`--日志警告`服务器选项已被删除。使用[`日志错误详细`](server-system-variables.html#sysvar_log_error_verbosity)而是系统变量。

    [](<>)[](<>)[](<>)[](<>)

-   全球范围内[`sql_log_bin`](replication-options-binary-log.html#sysvar_sql_log_bin)系统变量已删除。`sql_log_bin`仅具有会话范围，并且应用程序依赖于访问`@@全球。sql_log_bin`应该进行调整。

    [](<>)[](<>)

-   这个`元数据锁定缓存大小`和`元数据\锁定\哈希\实例`系统变量被删除。

    [](<>)[](<>)[](<>)[](<>)

-   未使用的`日期格式`, `datetime_格式`, `时间格式`和`max_tmp_表`系统变量被删除。

    [](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

-   这些不推荐的兼容SQL模式将被删除：`DB2`, `MAXDB`, `MSSQL`, `MYSQL323`, `MYSQL40`,`甲骨文`,`PostgreSQL 后`,`NO_FIELD_OPTIONS`,`NO_KEY_OPTIONS`,`NO_TABLE_OPTIONS`.他们不能再分配给`sql_mode`系统变量或用作允许的值[**mysql转储**](mysqldump.html) [`- 兼容的`](mysqldump.html#option_mysqldump_compatible)选项。

    [](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

    删除`最大数据库`意味着[`时间戳`](datetime.html)数据类型[`创建表`](create-table.html)要么[`更改表`](alter-table.html)被视为[`时间戳`](datetime.html)，并且不再被视为[`约会时间`](datetime.html).

-   已弃用的`ASC`要么`DESC`限定词`通过...分组`子句被删除。以前依赖的查询`通过...分组`排序可能会产生与以前的 MySQL 版本不同的结果。要生成给定的排序顺序，请提供`订购方式`条款。

    [](<>)[](<>)

-   这`扩展`和`分区`的关键字[`解释`](explain.html)声明已被删除。这些关键字是不必要的，因为它们的效果始终处于启用状态。

    [](<>)[](<>)[](<>)[](<>)

-   这些与加密相关的项目被删除：

    -   这`编码（）`和`解码（）`职能。

        [](<>)[](<>)[](<>)[](<>)

    -   这`加密（）`功能。

        [](<>)[](<>)

    -   这`DES_ENCRYPT()`， 和`DES_DECRYPT()`函数，`--des-key 文件`选项，`have_crypt`系统变量`DES_KEY_FILE`选项[`冲洗`](flush.html)声明，以及`HAVE_CRYPT` **制作**选项。

         [](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

        代替已删除的加密功能：对于`加密（）`，考虑使用[`SHA2()`](encryption-functions.html#function_sha2)而不是单向散列。对于其他人，请考虑使用[`AES_ENCRYPT()`](encryption-functions.html#function_aes-encrypt)和[`AES_DECRYPT()`](encryption-functions.html#function_aes-decrypt)反而。

-   在 MySQL 5.7 中，不推荐使用多个名称下可用的几个空间函数，以使空间函数命名空间更加一致，目标是每个空间函数名称以`英石_`如果它执行一个精确的操作，或者`MBR`如果它执行基于最小边界矩形的操作。在 MySQL 8.0 中，不推荐使用的函数被删除，只留下相应的`英石_`和`MBR`职能：

    -   这些功能被删除，有利于`MBR`名称：`包含（）`, `不相交（）`, `等于（）`, `相交（）`, `重叠（）`, `之内（）`.

        [](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

    -   这些功能被删除，有利于`英石_`名称：`区域（）`, `二进制（）`, `AsText()`, `AsWKB()`, `AsWKT()`, `缓冲（）`, `质心（）`, `凸包（）`, `十字架（）`, `方面（）`, `距离（）`, `端点（）`, `信封（）`, `外环（）`, `GeomCollFromText()`, `GeomCollFromWKB()`, `GeomFromText()`, `GeomFromWKB()`, `GeometryCollectionFromText()`, `GeometryCollectionFromWKB()`, `GeometryFromText()`, `GeometryFromWKB()`, `几何N()`, `几何类型（）`, `内环N()`, `已经关闭（）`, `是空的（）`, `简单（）`, `LineFromText()`, `LineFromWKB()`, `LineStringFromText()`, `LineStringFromWKB()`, `MLineFromText()`, `MLineFromWKB()`, `MPointFromText()`, `MPointFromWKB()`, `MPolyFromText()`, `MPolyFromWKB()`, `MultiLineStringFromText()`, `MultiLineStringFromWKB()`, `MultiPointFromText()`, `MultiPointFromWKB()`, `MultiPolygonFromText()`, `MultiPolygonFromWKB()`, `几何数（）`, `NumInteriorRings()`, `点数（）`, `PointFromText()`, `PointFromWKB()`, `点N()`, `PolyFromText()`, `PolyFromWKB()`,`PolygonFromText()`,`PolygonFromWKB()`,`SRID()`,`起点（）`,`触摸（）`,`X（）`,`Y()`.

        [](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

    -   `G长度（）`被删除以支持[`ST_长度（）`](gis-linestring-property-functions.html#function_st-length).

        [](<>)[](<>)

-   中描述的功能[第 12.17.4 节，“从 WKB 值创建几何值的函数”](gis-wkb-functions.html)以前接受 WKB 字符串或几何参数。不再允许几何参数并产生错误。有关将查询从使用几何参数迁移出来的指南，请参阅该部分。

    [](<>)[](<>)

-   解析器不再处理`\N`作为同义词`空值`在 SQL 语句中。采用`空值`反而。

    [](<>)[](<>)

    此更改不会影响使用执行的文本文件导入或导出操作[`加载数据`](load-data.html)要么[`选择...进入文件`](select-into.html), 为此`空值`继续由`\N`.看[第 13.2.7 节，“加载数据语句”](load-data.html).

-   `程序分析（）`语法被删除。

    [](<>)[](<>)

-   客户端`--ssl`和`--ssl-验证服务器证书`选项已被删除。采用[`--ssl 模式=必需`](connection-options.html#option_general_ssl-mode)代替`--ssl=1`要么`--启用-ssl`.采用[`--ssl-mode=禁用`](connection-options.html#option_general_ssl-mode)代替`--ssl=0`,`--skip-ssl`， 要么`--禁用-ssl`.采用[`--ssl-mode=VERIFY_IDENTITY`](connection-options.html#option_general_ssl-mode)代替`--ssl-验证服务器证书`选项。（服务器端[`--ssl`](server-options.html#option_mysqld_ssl)选项仍然可用，但自 MySQL 8.0.26 起已弃用，并且在未来的 MySQL 版本中可能会被删除。）

    [](<>)[](<>)[](<>)[](<>)

    对于 C API，`MYSQL_OPT_SSL_ENFORCE`和`MYSQL_OPT_SSL_VERIFY_SERVER_CERT`选项[`mysql_options()`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-options.html)对应客户端`--ssl`和`--ssl-验证服务器证书`选项并被删除。采用`MYSQL_OPT_SSL_MODE`期权价值为`SSL_MODE_REQUIRED`要么`SSL_MODE_VERIFY_IDENTITY`反而。

    [](<>)[](<>)[](<>)[](<>)

-   这`--临时池`服务器选项已删除。

    [](<>)[](<>)

-   这`ignore_builtin_innodb`系统变量被删除。

    [](<>)[](<>)

-   服务器不再将包含特殊字符的 pre-MySQL 5.1 数据库名称转换为 5.1 格式，并添加了一个`#mysql50#`字首。由于不再执行这些转换，`--fix-db-names`和`--fix-table-names`选项[**mysql检查**](mysqlcheck.html)， 这`升级数据目录名称`的条款[`更改数据库`](alter-database.html)声明，以及`Com_alter_db_upgrade`状态变量被删除。

    [](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

    仅支持从一个主要版本升级到另一个主要版本（例如，从 5.0 到 5.1，或从 5.1 到 5.5），因此几乎不需要将旧的 5.0 数据库名称转换为当前版本的 MySQL。作为一种解决方法，在升级到更新版本之前，将 MySQL 5.0 安装升级到 MySQL 5.1。

-   这**mysql\_安装\_D b**程序已从 MySQL 发行版中删除。数据目录初始化应该通过调用来执行[**mysqld**](mysqld.html)与[`- 初始化`](server-options.html#option_mysqld_initialize)要么[`--初始化不安全`](server-options.html#option_mysqld_initialize-insecure)选项。除此之外`--引导程序`选项[**mysqld**](mysqld.html)被使用的**mysql\_安装\_D b**被删除，并且`INSTALL_SCRIPTDIR` `制作`控制安装位置的选项**mysql\_安装\_D b**去掉了。

    [](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

-   通用分区处理程序已从 MySQL 服务器中删除。为了支持给定表的分区，用于表的存储引擎现在必须提供自己的（“本机”）分区处理程序。这`- 划分`和`--skip-partition`选项从 MySQL 服务器中删除，并且与分区相关的条目不再显示在输出中[`显示插件`](show-plugins.html)或在[`INFORMATION_SCHEMA.PLUGINS`](information-schema-plugins-table.html)桌子。

    [](<>)[](<>)[](<>)[](<>)

    目前有两个 MySQL 存储引擎提供原生分区支持：[`InnoDB`](innodb-storage-engine.html)和[`新开发银行`](mysql-cluster.html).其中，只有`InnoDB`在 MySQL 8.0 中受支持。使用任何其他存储引擎在 MySQL 8.0 中创建分区表的任何尝试都会失败。

    **升级的后果。**使用其他存储引擎直接升级分区表`InnoDB`（如[`MyISAM`](myisam-storage-engine.html)) 从 MySQL 5.7（或更早版本）到 MySQL 8.0 不受支持。处理这样的表有两种选择：

    -   删除表的分区，使用[`ALTER TABLE ... 删除分区`](alter-table-partition-operations.html).

    -   将用于表的存储引擎更改为`InnoDB`， 和[`ALTER TABLE ... 引擎=INNODB`](alter-table.html).

        必须为每个已分区的非`InnoDB`将服务器升级到 MySQL 8.0 之前的表。否则，升级后无法使用此类表。

        由于会导致使用没有分区支持的存储引擎的分区表的表创建语句现在失败并出现错误（ER\_查看\_不是\_已实现），您必须确保转储文件中的任何语句（例如由[**mysql转储**](mysqldump.html)) 从您希望导入到创建分区表的 MySQL 8.0 服务器的旧版本 MySQL 中，不要同时指定存储引擎，例如`MyISAM`没有本机分区处理程序。您可以通过执行以下任一操作来做到这一点：

    -   删除对分区的任何引用`创建表`使用值的语句`存储引擎`以外的选项`InnoDB`.

    -   指定存储引擎为`InnoDB`, 或允许`InnoDB`默认用作表的存储引擎。

        有关详细信息，请参阅[第 24.6.2 节，“与存储引擎相关的分区限制”](partitioning-limitations-storage-engines.html).

-   系统和状态变量信息不再保留在`INFORMATION_SCHEMA`.这些表被删除：`GLOBAL_VARIABLES`,`SESSION_VARIABLES`,`全球状态`,`会话状态`.请改用相应的性能架构表。看[第 27.12.14 节，“性能模式系统变量表”](performance-schema-system-variable-tables.html)， 和[第 27.12.15 节，“性能模式状态变量表”](performance-schema-status-variable-tables.html).除此之外`显示兼容性_56`系统变量被删除。用于系统和状态变量信息的过渡期`INFORMATION_SCHEMA`表已移至性能模式表，不再需要。这些状态变量被删除：`Slave_heartbeat_period`,`Slave_last_heartbeat`,`Slave_received_heartbeats`,`Slave_reried_transactions`,`从属运行`.他们提供的信息可在性能模式表中找到；看[迁移到性能模式系统和状态变量表](https://dev.mysql.com/doc/refman/5.7/en/performance-schema-variable-table-migration.html).

    [](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)[](<>)

-   性能模式`setup_timers`表被删除，因为是`打钩`排在[`性能计时器`](performance-schema-performance-timers-table.html)桌子。

    [](<>)[](<>)[](<>)[](<>)

-   这`库mysqld`删除了嵌入式服务器库，以及：

    [](<>)[](<>)[](<>)[](<>)

    -   这[`mysql_options()`](https://dev.mysql.com/doc/c-api/8.0/en/mysql-options.html) `MYSQL_OPT_GUESS_CONNECTION`, `MYSQL_OPT_USE_EMBEDDED_CONNECTION`, `MYSQL_OPT_USE_REMOTE_CONNECTION`， 和`MYSQL_SET_CLIENT_IP`选项

    -   这[**mysql\_配置**](mysql-config.html) `--libmysqld-libs`, `--嵌入式库`， 和`--嵌入式`选项

    -   这**制作** `WITH_EMBEDDED_SERVER`, `WITH_EMBEDDED_SHARED_LIBRARY`， 和`INSTALL_SECURE_FILE_PRIV_EMBEDDEDDIR`选项

    -   （无证）[**mysql**](mysql.html) `--服务器参数`选项

    -   这**mysql测试** `--嵌入式服务器`,`--服务器参数`， 和`--服务器文件`选项

    -   这**mysql测试\_嵌入式**和**mysql\_客户\_测试\_嵌入式**测试程序

-   这**mysql\_插入**实用程序被删除。替代方法包括在服务器启动时使用[`--插件加载`](server-options.html#option_mysqld_plugin-load)要么[`--plugin-load-add`](server-options.html#option_mysqld_plugin-load-add)选项，或在运行时使用[`安装插件`](install-plugin.html)陈述。

    [](<>)[](<>)

-   这**解析IP**实用程序被删除。**nslookup**,**主持人**， 要么**挖**可以代替使用。

    [](<>)[](<>)

-   这**解决\_堆\_倾倒**实用程序被删除。来自官方 MySQL 构建的堆栈跟踪始终是符号化的，因此无需使用**解决\_堆\_倾倒**.

    [](<>)[](<>)

-   以下服务器错误代码未使用且已被删除。应更新专门针对这些错误进行测试的应用程序。

    [](<>)[](<>)

    ```
    ER_BINLOG_READ_EVENT_CHECKSUM_FAILURE
    ER_BINLOG_ROW_RBR_TO_SBR
    ER_BINLOG_ROW_WRONG_TABLE_DEF
    ER_CANT_ACTIVATE_LOG
    ER_CANT_CHANGE_GTID_NEXT_IN_TRANSACTION
    ER_CANT_CREATE_FEDERATED_TABLE
    ER_CANT_CREATE_SROUTINE
    ER_CANT_DELETE_FILE
    ER_CANT_GET_WD
    ER_CANT_SET_GTID_PURGED_WHEN_GTID_MODE_IS_OFF
    ER_CANT_SET_WD
    ER_CANT_WRITE_LOCK_LOG_TABLE
    ER_CREATE_DB_WITH_READ_LOCK
    ER_CYCLIC_REFERENCE
    ER_DB_DROP_DELETE
    ER_DELAYED_NOT_SUPPORTED
    ER_DIFF_GROUPS_PROC
    ER_DISK_FULL
    ER_DROP_DB_WITH_READ_LOCK
    ER_DROP_USER
    ER_DUMP_NOT_IMPLEMENTED
    ER_ERROR_DURING_CHECKPOINT
    ER_ERROR_ON_CLOSE
    ER_EVENTS_DB_ERROR
    ER_EVENT_CANNOT_DELETE
    ER_EVENT_CANT_ALTER
    ER_EVENT_COMPILE_ERROR
    ER_EVENT_DATA_TOO_LONG
    ER_EVENT_DROP_FAILED
    ER_EVENT_MODIFY_QUEUE_ERROR
    ER_EVENT_NEITHER_M_EXPR_NOR_M_AT
    ER_EVENT_OPEN_TABLE_FAILED
    ER_EVENT_STORE_FAILED
    ER_EXEC_STMT_WITH_OPEN_CURSOR
    ER_FAILED_ROUTINE_BREAK_BINLOG
    ER_FLUSH_MASTER_BINLOG_CLOSED
    ER_FORM_NOT_FOUND
    ER_FOUND_GTID_EVENT_WHEN_GTID_MODE_IS_OFF__UNUSED
    ER_FRM_UNKNOWN_TYPE
    ER_GOT_SIGNAL
    ER_GRANT_PLUGIN_USER_EXISTS
    ER_GTID_MODE_REQUIRES_BINLOG
    ER_GTID_NEXT_IS_NOT_IN_GTID_NEXT_LIST
    ER_HASHCHK
    ER_INDEX_REBUILD
    ER_INNODB_NO_FT_USES_PARSER
    ER_LIST_OF_FIELDS_ONLY_IN_HASH_ERROR
    ER_LOAD_DATA_INVALID_COLUMN_UNUSED
    ER_LOGGING_PROHIBIT_CHANGING_OF
    ER_MALFORMED_DEFINER
    ER_MASTER_KEY_ROTATION_ERROR_BY_SE
    ER_NDB_CANT_SWITCH_BINLOG_FORMAT
    ER_NEVER_USED
    ER_NISAMCHK
    ER_NO_CONST_EXPR_IN_RANGE_OR_LIST_ERROR
    ER_NO_FILE_MAPPING
    ER_NO_GROUP_FOR_PROC
    ER_NO_RAID_COMPILED
    ER_NO_SUCH_KEY_VALUE
    ER_NO_SUCH_PARTITION__UNUSED
    ER_OBSOLETE_CANNOT_LOAD_FROM_TABLE
    ER_OBSOLETE_COL_COUNT_DOESNT_MATCH_CORRUPTED
    ER_ORDER_WITH_PROC
    ER_PARTITION_SUBPARTITION_ERROR
    ER_PARTITION_SUBPART_MIX_ERROR
    ER_PART_STATE_ERROR
    ER_PASSWD_LENGTH
    ER_QUERY_ON_MASTER
    ER_RBR_NOT_AVAILABLE
    ER_SKIPPING_LOGGED_TRANSACTION
    ER_SLAVE_CHANNEL_DELETE
    ER_SLAVE_MULTIPLE_CHANNELS_HOST_PORT
    ER_SLAVE_MUST_STOP
    ER_SLAVE_WAS_NOT_RUNNING
    ER_SLAVE_WAS_RUNNING
    ER_SP_GOTO_IN_HNDLR
    ER_SP_PROC_TABLE_CORRUPT
    ER_SQL_MODE_NO_EFFECT
    ER_SR_INVALID_CREATION_CTX
    ER_TABLE_NEEDS_UPG_PART
    ER_TOO_MUCH_AUTO_TIMESTAMP_COLS
    ER_UNEXPECTED_EOF
    ER_UNION_TABLES_IN_DIFFERENT_DIR
    ER_UNSUPPORTED_BY_REPLICATION_THREAD
    ER_UNUSED1
    ER_UNUSED2
    ER_UNUSED3
    ER_UNUSED4
    ER_UNUSED5
    ER_UNUSED6
    ER_VIEW_SELECT_DERIVED_UNUSED
    ER_WRONG_MAGIC
    ER_WSAS_FAILED
    ```

-   已弃用的`INFORMATION_SCHEMA` `INNODB_LOCKS`和`INNODB_LOCK_WAITS`表被删除。使用性能模式[`数据锁`](performance-schema-data-locks-table.html)和[`data_lock_waits`](performance-schema-data-lock-waits-table.html)代替表。

    [](<>)[](<>)[](<>)[](<>)

    笔记

    在 MySQL 5.7 中，`LOCK_TABLE`列中的`INNODB_LOCKS`表和`锁定表`列中的`系统`图式[`innodb_lock_waits`](sys-innodb-lock-waits.html)和[`x$innodb_lock_waits`](sys-innodb-lock-waits.html)视图包含组合的模式/表名称值。在 MySQL 8.0 中，[`数据锁`](performance-schema-data-locks-table.html)表和`系统`架构视图包含单独的架构名称和表名称列。看[第 28.4.3.9 节，“innodb\_锁\_等待和 x$innodb\_锁\_观望”](sys-innodb-lock-waits.html).

-   `InnoDB`不再支持压缩临时表。什么时候[`innodb_strict_mode`](innodb-parameters.html#sysvar_innodb_strict_mode)已启用（默认），[`创建临时表`](create-table.html)如果返回错误`ROW_FORMAT=压缩`要么`KEY_BLOCK_SIZE`被指定。如果[`innodb_strict_mode`](innodb-parameters.html#sysvar_innodb_strict_mode)被禁用，发出警告并使用非压缩行格式创建临时表。

    [](<>)[](<>)

-   `InnoDB`不再创造`.isl`文件（`InnoDB`符号链接文件）在 MySQL 数据目录之外创建表空间数据文件时。这[`innodb_directories`](innodb-parameters.html#sysvar_innodb_directories)选项现在支持定位在数据目录之外创建的表空间文件。

    通过此更改，在服务器脱机时通过手动修改`.isl`不再支持文件。现在支持移动远程表空间文件[`innodb_directories`](innodb-parameters.html#sysvar_innodb_directories)选项。看[第 15.6.3.6 节，“在服务器脱机时移动表空间文件”](innodb-moving-data-files-offline.html).

    [](<>)[](<>)

-   下列`InnoDB`文件格式变量被删除：

    -   `innodb_file_format`

        [](<>)[](<>)

    -   `innodb_file_format_check`

        [](<>)[](<>)

    -   `innodb_file_format_max`

        [](<>)[](<>)

    -   `innodb_large_prefix`

         [](<>)[](<>)

        文件格式变量是创建与早期版本兼容的表所必需的`InnoDB`在 MySQL 5.1 中。现在 MySQL 5.1 已经到了其产品生命周期的终点，不再需要这些选项。

        这`文件格式`列已从[`INNODB_TABLES`](information-schema-innodb-tables-table.html)和[`INNODB_TABLESPACES`](information-schema-innodb-tablespaces-table.html)信息模式表。

    [](<>)[](<>)

-   这`innodb_support_xa`删除了系统变量，该变量支持 XA 事务中的两阶段提交。`InnoDB`始终启用对 XA 事务中的两阶段提交的支持。

    [](<>)[](<>)

-   已删除对 DTrace 的支持。

    [](<>)[](<>)

-   这`JSON_APPEND()`功能被删除。采用[`JSON_ARRAY_APPEND()`](json-modification-functions.html#function_json-array-append)反而。

    [](<>)[](<>)

-   支持将表分区放在共享中`InnoDB`MySQL 8.0.13 中删除了表空间。共享表空间包括`InnoDB`系统表空间和通用表空间。有关识别共享表空间中的分区并将它们移动到 file-per-table 表空间的信息，请参阅[第 2.11.5 节，“准备升级安装”](upgrade-prerequisites.html).

    [](<>)[](<>)

-   支持在语句以外的语句中设置用户变量[`放`](set-variable.html)在 MySQL 8.0.13 中已弃用。此功能可能会在 MySQL 9.0 中删除。

    [](<>)[](<>)

-   这`--ndb` [**错误**](perror.html)选项被删除。使用[**数据库\_错误**](mysql-cluster-programs-ndb-perror.html)实用程序代替。

    [](<>)[](<>)

-   这`innodb_undo_logs`变量被删除。这[`innodb_rollback_segments`](innodb-parameters.html#sysvar_innodb_rollback_segments)变量执行相同的功能，应改为使用。

    [](<>)[](<>)

-   这`Innodb_available_undo_logs`状态变量已被删除。每个表空间的可用回滚段数可以使用`显示变量，如“innodb_rollback_segments”；`

    [](<>)[](<>)

-   从 MySQL 8.0.14 开始，以前不推荐使用的[`innodb_undo_tablespaces`](innodb-parameters.html#sysvar_innodb_undo_tablespaces)变量不再是可配置的。有关详细信息，请参阅[第 15.6.3.4 节，“撤消表空间”](innodb-undo-tablespaces.html).

    [](<>)[](<>)

-   支持`ALTER TABLE ...升级分区`声明已被删除。

    [](<>)[](<>)

-   从 MySQL 8.0.16 开始，支持[`internal_tmp_disk_storage_engine`](server-system-variables.html#sysvar_internal_tmp_disk_storage_engine)系统变量已被删除；磁盘上的内部临时表现在总是使用[`InnoDB`](innodb-storage-engine.html)存储引擎。看[磁盘内部临时表的存储引擎](internal-temporary-tables.html#internal-temporary-tables-engines-disk)，了解更多信息。

    [](<>)[](<>)

-   这[`DISABLE_SHARED`](source-configuration-options.html#option_cmake_disable_shared) **制作**选项未使用并已被删除。

    [](<>)[](<>)

-   这[`myisam_repair_threads`](server-system-variables.html#sysvar_myisam_repair_threads)MySQL 8.0.30 的系统变量。

    [](<>)[](<>)
