第1章一般信息

目录

1.1关于本手册
1.2印刷和语法约定
1.3 MySQL数据库管理系统概述
1.3.1什么是MySQL?
1.3.2 MySQL的主要特点
1.3.3 MySQL的历史
1.4 MySQL 8.0中有哪些新功能
1.5 MySQL 8.0中添加,弃用或删除了服务器和状态变量和选项
1.6 MySQL信息源
1.6.1 MySQL网站
1.6.2 MySQL邮件列表
1.6.3 MySQL论坛的MySQL社区支持
1.6.4 Internet中继聊天(IRC)上的MySQL社区支持
1.6.5 MySQL企业版
1.7如何报告错误或问题
1.8 MySQL标准合规性
1.8.1标准SQL的MySQL扩展
1.8.2 MySQL与标准SQL的区别
1.8.3 MySQL如何处理约束
1.9学分
1.9.1 MySQL的贡献者
1.9.2文件记录员和翻译人员
1.9.3支持MySQL的软件包
1.9.4用于创建MySQL的工具
1.9.5 MySQL的支持者

MySQL™软件提供了一个非常快速,多线程,多用户,强大的SQL(结构化查询语言)数据库服务器。 MySQL Server适用于关键任务,重载生产系统以及嵌入大规模部署的软件。 Oracle是Oracle Corporation和/或其附属公司的注册商标。 MySQL是Oracle Corporation和/或其附属公司的商标,未经Oracle明确书面授权,客户不得使用。 其他名称可能是其各自所有者的商标。

MySQL软件是Dual Licensed。 用户可以根据GNU通用公共许可证( http://www.fsf.org/licenses/ 的条款选择将MySQL软件用作开源产品, 也可以从Oracle购买标准商业许可证。 有关 我们的许可政策的更多信息, 访问http://www.mysql.com/company/legal/licensing/

以下列表描述了本手册中特别感兴趣的一些部分:

重要

要报告问题或错误,请使用 第1.7节“如何报告错误或问题”中的说明 如果您在MySQL服务器中发现敏感的安全漏洞,请立即通过发送电子邮件告知我们 例外:支持客户应向Oracle支持部门报告所有问题,包括安全漏洞。

1.1关于本手册

这是MySQL数据库系统8.0版到8.0.18版的参考手册。 MySQL 8.0的次要版本之间的差异在本文中引用了版本号(8.0。 x )。 有关许可证信息,请参阅 法律声明

由于MySQL 8.0和以前版本之间存在许多功能和其他差异,因此本手册不适用于旧版本的MySQL软件。 如果您使用的是早期版本的MySQL软件,请参阅相应的手册。 例如, MySQL 5.7参考手册 涵盖5.7系列MySQL软件版本。

由于本手册可作为参考,因此不提供有关SQL或关系数据库概念的一般说明。 它也没有教您如何使用您的操作系统或命令行解释器。

MySQL数据库软件正在不断发展,参考手册也经常更新。 最新版本的手册可在线搜索, 网址 https://dev.mysql.com/doc/ 其他格式也可用,包括HTML,PDF和EPUB版本。

参考手册源文件以DocBook XML格式编写。 HTML版本和其他格式是自动生成的,主要使用DocBook XSL样式表。 有关DocBook的信息,请参阅 http://docbook.org/

MySQL的源代码本身包含使用Doxygen编写的内部文档。 生成的Doxygen内容可用 https://dev.mysql.com/doc/index-other.html 也可以使用 第2.9.7节“生成MySQL Doxygen文档内容”中 的说明从MySQL源代码分发本地生成此内容

如果您对使用MySQL有疑问,可以使用我们的邮件列表或论坛询问他们。 请参见 第1.6.2节“MySQL邮件列表” 第1.6.3节“MySQL论坛中的MySQL社区支持” 如果您有关于手册本身的补充或更正的建议,请将它们发送到 http://www.mysql.com/company/contact/

本手册最初由David Axmark和Michael Monty Widenius 编写 它由MySQL文档团队维护,包括Chris Cole,Paul DuBois,Margaret Fisher,Edward Gilmore,Stefan Hinz,David Moss,Philip Olson,Daniel Price,Daniel So和Jon Stephens。

1.2印刷和语法约定

本手册使用某些印刷约定:

  • Text in this style 用于SQL语句; 数据库,表和列名称; 程序清单和源代码; 和环境变量。 示例: 要重新加载授权表,请使用该 FLUSH PRIVILEGES 语句。

  • Text in this style 表示您在示例中键入的输入。

  • 此样式的文本 表示可执行程序和脚本的名称,例如 mysql (MySQL命令行客户端程序)和 mysqld (MySQL服务器可执行文件)。

  • Text in this style 用于变量输入,您应该替换自己选择的值。

  • 此样式的文本 用于强调。

  • 这种风格的文字 用于表格标题,并特别强调。

  • Text in this style 用于指示影响程序执行方式的程序选项,或者提供程序以某种方式运行所需的信息。 例如 --host 选项(缩写形式 -h )告诉 MySQL的 客户端程序,它应该连接到MySQL服务器的主机名或IP地址

  • 文件名和目录名的写法如下: 全局 my.cnf 文件位于 /etc 目录中。

  • 字符序列的写法如下: 要指定通配符,请使用 ' % ' 字符。

当显示要在特定程序内执行的命令时,命令前面显示的提示指示要使用的命令。 例如, shell> 表示您从登录shell执行的命令 root-shell> 类似但应该执行 root ,并 mysql> 指示您从 mysql 客户端程序 执行的语句

shell> type a shell command here
root-shell> 
mysql>type a shell command as root heretype a mysql statement here

在一些区域中,可以将不同的系统彼此区分开以示出命令应该在两个不同的环境中执行。 例如,复制工作时的命令可能与前缀 master slave

主人> type a mysql command on the replication master here
奴隶>type a mysql command on the replication slave here

是您的命令解释器。 在Unix上,这通常是一个程序,如 sh csh bash 在Windows上,等效程序是 command.com cmd.exe ,通常在控制台窗口中运行。

输入示例中显示的命令或语句时,请不要键入示例中显示的提示。

数据库,表和列名称通常必须替换为语句。 为了指示这样的取代是必要的,本手册使用 db_name tbl_name col_name 例如,您可能会看到如下语句:

MySQL的> SELECT col_name FROM db_name.tbl_name;

这意味着如果您要输入类似的语句,您将提供自己的数据库,表和列名称,可能是这样的:

MySQL的> SELECT author_name FROM biblio_db.author_list;

SQL关键字不区分大小写,可以用任何字母大小写。 本手册使用大写。

在语法描述中,方括号( [ ] )表示可选的单词或子句。 例如,在以下语句中, IF EXISTS 是可选的:

DROP TABLE [IF EXISTS] tbl_name

当语法元素由许多替代项组成时,替代项由竖线( | 分隔 当从一组的一个选择部件 可以 被选择,则将替换方括号内所列的( [ ] ):

TRIM([[BOTH | LEADING | TRAILING] [ remstr] FROM] str

必须 选择 一组选项中的一个成员时 ,替代项将列在大括号( { } )中:

{DESCRIBE | DESC} tbl_name[ col_name| wild]

省略号( ... )表示省略了语句的一部分,通常是为了提供更复杂语法的更短版本。 例如, SELECT ... INTO OUTFILE SELECT 语句 形式的简写,该 语句 INTO OUTFILE 在语句的其他部分后面 有一个 子句。

省略号还可以指示可以重复语句的前面语法元素。 在下面的示例中, reset_option 可以给出 多个 值,每个值在第一个之后以逗号开头:

重置reset_option[,reset_option] ......

使用Bourne shell语法显示用于设置shell变量的命令。 例如,设置 CC 环境变量并运行 configure 命令 的顺序 在Bourne shell语法中如下所示:

外壳> CC=gcc ./configure

如果您使用的是 csh tcsh ,则必须以不同的方式发出命令:

shell> setenv CC gcc
shell>./configure

1.3 MySQL数据库管理系统概述

1.3.1什么是MySQL?

MySQL是最受欢迎的开源SQL数据库管理系统,由Oracle Corporation开发,分发和支持。

MySQL网站( http://www.mysql.com/ )提供有关MySQL软件的最新信息。

  • MySQL是一个数据库管理系统。

    数据库是数据的结构化集合。 它可以是从简单的购物清单到图片库或公司网络中的大量信息。 要添加,访问和处理存储在计算机数据库中的数据,您需要一个数据库管理系统,如MySQL Server。 由于计算机非常擅长处理大量数据,因此数据库管理系统在计算,独立实用程序或其他应用程序的一部分中发挥着核心作用。

  • MySQL数据库是关系型的。

    关系数据库将数据存储在单独的表中,而不是将所有数据放在一个大的库房中。 数据库结构被组织成针对速度优化的物理文件。 逻辑模型具有数据库,表,视图,行和列等对象,可提供灵活的编程环境。 您可以设置管理不同数据字段之间关系的规则,例如一对一,一对多,唯一,必需或可选,以及 不同表之间的 指针 数据库强制执行这些规则,因此使用设计良好的数据库,您的应用程序永远不会看到不一致,重复,孤立,过时或丢失的数据。

    MySQL 的SQL部分 代表 结构化查询语言 SQL是用于访问数据库的最常用的标准化语言。 根据您的编程环境,您可以直接输入SQL(例如,生成报告),将SQL语句嵌入到用其他语言编写的代码中,或使用隐藏SQL语法的特定于语言的API。

    SQL由ANSI / ISO SQL标准定义。 SQL标准自1986年以来一直在发展,并且存在多个版本。 在本手册中, SQL-92 是指1992年发布的标准, SQL:1999 是指1999年发布的标准, SQL:2003 是指当前版本的标准。 我们 在任何时候都 使用短语 SQL标准 来表示当前版本的SQL标准。

  • MySQL软件是开源的。

    开源意味着任何人都可以使用和修改软件。 任何人都可以从互联网上下载MySQL软件并使用它而无需支付任何费用。 如果您愿意,您可以学习源代码并根据需要进行更改。 MySQL软件使用GPL(GNU通用公共许可证) http://www.fsf.org/licenses/ 来定义在不同情况下您可能和不可以使用该软件的内容。 如果您对GPL感到不舒服或需要将MySQL代码嵌入到商业应用程序中,您可以从我们这里购买商业许可版本。 有关更多信息,请参阅MySQL许可概述( http://www.mysql.com/company/legal/licensing/ )。

  • MySQL数据库服务器非常快速,可靠,可扩展且易于使用。

    如果您正在寻找,那么您应该尝试一下。 MySQL服务器可以在台式机或笔记本电脑上与其他应用程序,Web服务器等一起轻松运行,几乎不需要关注。 如果您将整台机器专用于MySQL,则可以调整设置以利用所有可用的内存,CPU功率和I / O容量。 MySQL还可以扩展到联网的机器集群。

    MySQL Server最初是为了比现有解决方案更快地处理大型数据库而开发的,并且已经成功地在高要求的生产环境中使用了好几年。 虽然在不断发展的今天,MySQL服务器提供了丰富而有用的功能集。 它的连接性,速度和安全性使MySQL Server非常适合访问Internet上的数据库。

  • MySQL Server适用于客户端/服务器或嵌入式系统。

    MySQL数据库软件是一个客户端/服务器系统,由支持不同后端的多线程SQL服务器,几个不同的客户端程序和库,管理工具以及各种应用程序编程接口(API)组成。

    我们还提供MySQL Server作为嵌入式多线程库,您可以将其链接到您的应用程序,以获得更小,更快,更易于管理的独立产品。

  • 提供了大量贡献的MySQL软件。

    MySQL Server具有与我们的用户密切合作开发的一组实用功能。 您最喜欢的应用程序或语言很可能支持MySQL数据库服务器。

发音为 MySQL 的官方方式 我的Ess Que Ell (不是 我的续集 ),但我们不介意你将它发音为 我的续集 或其他一些本地化的方式。

1.3.2 MySQL的主要特点

本节介绍MySQL数据库软件的一些重要特性。 在大多数方面,该路线图适用于所有版本的MySQL。 有关在特定于系列的基础上引入MySQL的功能的信息,请参阅 相应手册 在坚果壳中 部分:

内部和可移植性

  • 用C和C ++编写。

  • 经过广泛的不同编译器测试。

  • 适用于许多不同的平台。 请参阅 https://www.mysql.com/support/supportedplatforms/database.html

  • 为了便于携带, 在MySQL 5.5及更高版本中 使用 CMake 以前的系列使用GNU Automake,Autoconf和Libtool。

  • 使用Purify(商业内存泄漏检测器)以及GPL工具Valgrind( http://developer.kde.org/~sewardj/ )进行测试。

  • 使用具有独立模块的多层服务器设计。

  • 设计为使用内核线程完全多线程,以便在可用时轻松使用多个CPU。

  • 提供事务性和非事务性存储引擎。

  • 使用 MyISAM 具有索引压缩的 非常快速的B树磁盘表( )。

  • 旨在使添加其他存储引擎相对容易。 如果要为内部数据库提供SQL接口,这非常有用。

  • 使用非常快速的基于线程的内存分配系统。

  • 使用优化的嵌套循环连接执行非常快速的连接。

  • 实现内存中的哈希表,用作临时表。

  • 使用应尽可能快的高度优化的类库实现SQL函数。 通常在查询初始化之后根本没有内存分配。

  • 将服务器作为单独的程序提供,用于客户端/服务器网络环境,以及作为可嵌入(链接)到独立应用程序的库。 此类应用程序可以单独使用,也可以在没有网络的环境中使用。

数据类型

陈述和职能

  • 查询 SELECT 列表和 WHERE 子句中的 完整运算符和函数支持 例如:

    mysql> SELECT CONCAT(first_name, ' ', last_name)
        - > FROM citizen
        - >WHERE income/dependents > 10000 AND age > 30;
    
  • 完全支持SQL GROUP BY ORDER BY 子句。 支持基函数( COUNT() AVG() STD() SUM() MAX() MIN() ,和 GROUP_CONCAT() )。

  • 支持 LEFT OUTER JOIN RIGHT OUTER JOIN 使用标准SQL和ODBC语法。

  • 根据标准SQL的要求支持表和列上的别名。

  • 支持 DELETE INSERT REPLACE ,和 UPDATE 以返回更改(受影响)的行数,或返回通过连接到服务器时设置标志,而不是匹配的行的数量。

  • 支持特定于MySQL的 SHOW 语句,用于检索有关数据库,存储引擎,表和索引的信息。 支持 INFORMATION_SCHEMA 数据库,根据标准SQL实现。

  • 一个 EXPLAIN 语句来显示优化器如何解决一个查询。

  • 表名或列名中函数名的独立性。 例如, ABS 是一个有效的列名。 唯一的限制是,对于函数调用,函数名和 它后面 ( 之间不允许有空格 请参见 第9.3节“关键字和保留字”

  • 您可以在同一语句中引用来自不同数据库的表。

安全

  • 特权和密码系统,非常灵活和安全,可以进行基于主机的验证。

  • 连接到服务器时加密所有密码流量的密码安全性。

可扩展性和限制

  • 支持大型数据库。 我们将MySQL Server与包含5000万条记录的数据库结合使用。 我们也知道使用MySQL服务器的用户有200,000个表和大约5,000,000,000行。

  • 每个表最多支持64个索引。 每个索引可以包含1到16列或部分列。 InnoDB 的最大索引宽度为 767字节或3072字节。 请参见 第15.6.1.6节“InnoDB表的限制” MyISAM 的最大索引宽度为 1000个字节。 请参见 第16.2节“MyISAM存储引擎” 索引可使用的柱的前缀 CHAR VARCHAR BLOB ,或 TEXT 列类型。

连接

  • 客户端可以使用多种协议连接到MySQL Server:

    • 客户端可以在任何平台上使用TCP / IP套接字进行连接。

    • 在Windows系统上,如果使用该 --enable-named-pipe 选项 启动服务器,则客户端可以使用命名管道进行连接 如果使用该 --shared-memory 选项 启动,Windows服务器也支持共享内存连接 客户端可以使用该 --protocol=memory 选项 通过共享内存进行连接

    • 在Unix系统上,客户端可以使用Unix域套接字文件进行连接。

  • MySQL客户端程序可以用多种语言编写。 用C编写的客户端库可用于用C或C ++编写的客户端,或者用于提供C绑定的任何语言。

  • 提供C,C ++,Eiffel,Java,Perl,PHP,Python,Ruby和Tcl的API,使MySQL客户端能够以多种语言编写。 请参见 第28章, 连接器和API

  • Connector / ODBC(MyODBC)接口为使用ODBC(开放式数据库连接)连接的客户端程序提供MySQL支持。 例如,您可以使用MS Access连接到MySQL服务器。 客户端可以在Windows或Unix上运行。 连接器/ ODBC源可用。 与许多其他功能一样,支持所有ODBC 2.5功能。 请参阅 MySQL Connector / ODBC开发人员指南

  • Connector / J接口为使用JDBC连接的Java客户端程序提供MySQL支持。 客户端可以在Windows或Unix上运行。 连接器/ J源可用。 请参阅 MySQL Connector / J 5.1开发人员指南

  • MySQL Connector / NET使开发人员能够轻松创建需要与MySQL进行安全,高性能数据连接的.NET应用程序。 它实现了所需的ADO.NET接口,并集成到ADO.NET感知工具中。 开发人员可以使用他们选择的.NET语言来构建应用程序。 MySQL Connector / NET是一个完全托管的ADO.NET驱动程序,用100%纯C#编写。 请参阅 MySQL Connector / NET Developer Guide

本土化

  • 服务器可以以多种语言向客户端提供错误消息。 请参见 第10.11节“设置错误消息语言”

  • 几个不同的字符集,包括全面支持 latin1 (CP1252) , german big5 ujis 一些Unicode字符集等。 例如, 表格和列名称中允许 使用斯堪的纳维亚字符 å ä ö

  • 所有数据都保存在所选字符集中。

  • 根据默认字符集和排序规则进行排序和比较。 启动MySQL服务器时可以更改此 设置 (请参见 第10.3.2节“服务器字符集和排序” )。 要查看非常高级排序的示例,请查看捷克排序代码。 MySQL Server支持许多可在编译时和运行时指定的不同字符集。

  • 可以动态更改服务器时区,并且各个客户端可以指定自己的时区。 请参见 第5.1.13节“MySQL服务器时区支持”

客户端和工具

  • MySQL包括几个客户端和实用程序。 这些包括命令行程序,如 mysqldump mysqladmin ,以及图形程序,如 MySQL Workbench

  • MySQL Server内置支持SQL语句来检查,优化和修复表。 这些语句可以从命令行通过 mysqlcheck 客户端获得。 MySQL还包括 myisamchk ,这是一个非常快速的命令行实用程序,用于在 MyISAM 上执行这些操作 请参见 第4章, MySQL程序

  • 可以使用 --help -? 选项 调用MySQL程序 以获取在线帮助。

1.3.3 MySQL的历史

我们最初的目的是使用 mSQL 数据库系统使用我们自己的快速低级(ISAM)例程连接到我们的表。 然而,经过一些测试,我们得出的结论 mSQL 是,对于我们的需求来说 ,这个结论 还不够快或不够灵活。 这导致了一个新的SQL接口到我们的数据库,但具有几乎相同的API接口 mSQL 此API旨在使用于编写的第三方代码能够 mSQL 轻松移植以便与MySQL一起使用。

MySQL以联合创始人Monty Widenius的女儿My。命名。

MySQL Dolphin(我们的标识)的名称是 Sakila ,它是从我们的 海豚 名人 比赛 用户建议的大量名单中选出的 获奖名称由非洲斯威士兰的开源软件开发商Ambrose Twebaze提交。 根据安布罗斯的说法,女性名字Sakila的根源在于斯威士兰当地语言SiSwati。 Sakila也是坦桑尼亚阿鲁沙一个小镇的名字,靠近Ambrose的原籍乌干达。

1.4 MySQL 8.0中有哪些新功能

本节总结了MySQL 8.0中添加,弃用和删除的内容。 随附部分列出了在MySQL 8.0中添加,弃用或删除的MySQL服务器选项和变量。 请参见 第1.5节“在MySQL 8.0中添加,弃用或删除的服务器和状态变量和选项”

MySQL 8.0中添加的功能

MySQL 8.0中添加了以下功能:

  • 数据字典。  MySQL现在包含一个事务数据字典,用于存储有关数据库对象的信息。 在以前的MySQL版本中,字典数据存储在元数据文件和非事务表中。 有关更多信息,请参见 第14章, MySQL数据字典

  • 原子数据定义语句(Atomic DDL)。  原子DDL语句将与DDL操作关联的数据字典更新,存储引擎操作和二进制日志写入组合到单个原子事务中。 有关更多信息,请参见 第13.1.1节“原子数据定义语句支持”

  • 升级程序。  以前,在安装新版本的MySQL之后,MySQL服务器会在下次启动时自动升级数据字典表,之后DBA会 手动 调用 mysql_upgrade 来升级 mysql 架构中 的系统表 ,以及其他对象。模式,例如 sys 模式和用户模式。

    从MySQL 8.0.16开始,服务器执行以前由 mysql_upgrade 处理的任务 安装新的MySQL版本后,服务器现在会在下次启动时自动执行所有必要的升级任务,并且不依赖于DBA调用 mysql_upgrade 此外,服务器更新帮助表的内容( mysql_upgrade 没有这样做)。 新的 --upgrade 服务器选项可控制服务器如何执行自动数据字典和服务器升级操作。 有关更多信息,请参见 第2.11.3节“MySQL升级过程升级”

  • 安全和帐户管理。  添加了这些增强功能以​​提高安全性并在帐户管理中实现更高的DBA灵活性:

    • mysql 系统数据库中 的授权表现在 InnoDB (事务性)表。 以前,这些是 MyISAM (非交易)表格。 授权表存储引擎的更改是对帐户管理语句行为的伴随变更的基础。 以前,帐户管理声明(例如 CREATE USER DROP USER )命名多个用户可以为某些用户成功而对其他用户失败。 现在,每个语句都是事务性的,并且对所有命名用户都成功或回滚,如果发生任何错误则无效。 如果成功,则将语句写入二进制日志,但如果失败则不写入; 在这种情况下,发生回滚并且不进行任何更改。 有关更多信息,请参见 第13.1.1节“原子数据定义语句支持”

    • 可以使用新的 caching_sha2_password 身份验证插件。 sha256_password 插件 一样 caching_sha2_password 实现SHA-256密码散列,但使用缓存来解决连接时的延迟问题。 它还支持更多连接协议,并且不需要针对基于RSA密钥对的密码交换功能进行OpenSSL链接。 请参见 第6.4.1.3节“缓存SHA-2可插入认证”

      caching_sha2_password sha256_password 认证插件提供比更安全的密码加密 mysql_native_password 插件,并 caching_sha2_password 提供了比更好的性能 sha256_password 由于这些优越的安全性和性能特性 caching_sha2_password ,它现在是首选的身份验证插件,而且也是默认的身份验证插件而不是 mysql_native_password 有关此默认插件更改对服务器操作的影响以及服务器与客户端和连接器的兼容性的信息,请参阅 caching_sha2_password作为首选身份验证插件

    • MySQL现在支持角色,这些角色被命名为特权集合。 可以创建和删除角色。 角色可以拥有授予和撤消的权限。 可以向用户帐户授予和撤消角色。 可以从授予帐户的帐户中选择帐户的活动适用角色,并且可以在该帐户的会话期间更改。 有关更多信息,请参见 第6.2.10节“使用角色”

    • MySQL现在结合了用户帐户类别的概念,系统和常规用户根据他们是否拥有 SYSTEM_USER 权限进行 区分 请参见 第6.2.11节“帐户类别”

    • 以前,除了某些模式之外,无法授予全局适用的权限。 现在,如果 partial_revokes 启用 系统变量,则可以执行此操作。 请参见 第6.2.12节“使用部分撤消的权限限制”

    • GRANT 语句有一个 子句,指定有关用于语句执行的特权上下文的其他信息。 此语法在SQL级别可见,但其主要目的是通过使这些限制出现在二进制日志中,在部分撤销所强制的所有节点上实现统一复制。 请参见 第13.7.1.6节“GRANT语法” AS user [WITH ROLE]

    • MySQL现在维护有关密码历史的信息,从而限制了以前密码的重用。 DBA可能要求在某些密码更改或时间段内不从先前的密码中选择新密码。 可以在全局以及每个帐户的基础上建立密码重用策略。

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

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

      这些新功能为DBA提供了更完整的密码管理控制。 有关更多信息,请参见 第6.2.15节“密码管理”

    • MySQL现在支持FIPS模式,如果使用OpenSSL编译,并且OpenSSL库和FIPS对象模块在运行时可用。 FIPS模式对加密操作施加了条件,例如对可接受的加密算法的限制或对更长密钥长度的要求。 请参见 第6.5节“FIPS支持”

    • 服务器用于新连接的SSL上下文现在可在运行时重新配置。 例如,此功能可能很有用,可以避免重新启动已运行太久以至于其SSL证书已过期的MySQL服务器。 请参阅 加密连接的服务器端运行时配置

    • OpenSSL 1.1.1支持用于加密连接的TLS v1.3协议,如果使用OpenSSL 1.1.1或更高版本编译,MySQL现在也支持TLS v1.3。 请参见 第6.3.6节“加密连接协议和密码”

    • MySQL现在将授予命名管道上的客户端的访问控制设置为在Windows上成功通信所需的最小值。 较新的MySQL客户端软件无需任何其他配置即可打开命名管道连接。 如果无法立即升级较旧的客户端软件, named_pipe_full_access_group 则可以使用 新的 服务器系统变量为Windows组提供打开命名管道连接所需的权限。 完全访问组的成员资格应该受到限制并且是临时的。

  • 资源管理。  MySQL现在支持资源组的创建和管理,并允许将服务器内运行的线程分配给特定组,以便线程根据组可用的资源执行。 组属性可以控制其资源,以启用或限制组中线程的资源消耗。 DBA可以根据不同的工作负载修改这些属性。 目前,CPU时间是一个可管理的资源,以 虚拟CPU 的概念为代表 作为包含CPU核心,超线程,硬件线程等的术语。 服务器在启动时确定可用的虚拟CPU数量,具有适当权限的数据库管理员可以将这些CPU与资源组关联,并将线程分配给组。 有关更多信息,请参见 第8.12.5节“资源组”

  • 表加密管理。  现在可以通过定义和实施加密默认值来全局管理表加密。 default_table_encryption 变量为新创建的模式和常规表空间定义加密默认值。 DEFAULT ENCRYPTION 在创建模式时, 也可以使用 子句 定义模式的加密缺省值 默认情况下,表继承对其创建的模式或常规表空间的加密。通过启用加密默认值来强制执行 table_encryption_privilege_check 变量。 在创建或更改加密设置与设置不同的模式或常规表空间 default_table_encryption 时,或者在创建或更改加密设置与默认模式加密不同的表时, 会发生权限检查 启用后, TABLE_ENCRYPTION_ADMIN 权限允许覆盖默认加密设置 table_encryption_privilege_check 有关更多信息,请参阅 为架构和常规表空间定义加密默认值

  • InnoDB增强功能。  增加了这些 InnoDB 增强功能:

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

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

      • ROLLBACK 操作之后 立即重新启动服务器 不再导致重用已分配给回滚事务的自动增量值。

      • 如果将 AUTO_INCREMENT 列值 修改为 大于当前最大自动增量值的值( UPDATE 例如,在操作中),则新值将保持不变,后续 INSERT 操作将从新的较大值开始分配自动增量值。

      有关更多信息,请参见 第15.6.1.4节“InnoDB中的AUTO_INCREMENT处理” InnoDB AUTO_INCREMENT计数器初始化

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

    • InnoDB 分布式缓存 插件支持多个 get 操作(读取在一个单一的多键-值对 分布式缓存 查询)和范围查询。 请参见 第15.19.4节“InnoDB memcached多个获取和范围查询支持”

    • 新的动态变量 innodb_deadlock_detect 可用于禁用死锁检测。 在高并发系统上,当许多线程等待同一个锁时,死锁检测会导致速度减慢。 有时,禁用死锁检测可能更有效,并且在 innodb_lock_wait_timeout 发生死锁时 依赖于 事务回滚 设置。

    • INFORMATION_SCHEMA.INNODB_CACHED_INDEXES 表报告 InnoDB 每个索引缓冲池中 缓存的索引页数

    • InnoDB 现在,在共享临时表空间中创建临时表 ibtmp1

    • InnoDB 表空间加密功能 支持重做日志的加密和撤消日志数据。 请参阅 重做日志加密 撤消日志加密

    • InnoDB 支持 NOWAIT SKIP LOCKED 选项 SELECT ... FOR SHARE 以及 SELECT ... FOR UPDATE 锁定读取语句。 NOWAIT 如果请求的行被另一个事务锁定,则会导致语句立即返回。 SKIP LOCKED 从结果集中删除锁定的行。 请参阅 使用NOWAIT和SKIP LOCKED锁定读取并发

      SELECT ... FOR SHARE 替换 SELECT ... LOCK IN SHARE MODE ,但 LOCK IN SHARE MODE 仍可用于向后兼容。 这些陈述是等同的。 然而, FOR UPDATE FOR SHARE 支持 NOWAIT SKIP LOCKED 选项。 请参见 第13.2.10节“SELECT语法” OF tbl_name

      OF tbl_name 将锁定查询应用于命名表。

    • ADD PARTITION DROP PARTITION COALESCE PARTITION REORGANIZE PARTITION ,和 REBUILD PARTITION ALTER TABLE 选项由本地分区就地API的支持,可能与使用 ALGORITHM={COPY|INPLACE} LOCK 条款。

      DROP PARTITION ALGORITHM=INPLACE 存储在该分区删除数据并丢弃分区。 但是, DROP PARTITION 使用 ALGORITHM=COPY old_alter_table=ON 重建分区表并尝试将数据从已删除的分区移动到具有兼容 PARTITION ... VALUES 定义的 另一个分区 将删除无法移动到其他分区的数据。

    • InnoDB 存储引擎现在使用MySQL的数据字典,而不是它自己的存储引擎特定的数据字典。 有关数据字典的信息,请参阅 第14章, MySQL数据字典

    • mysql 系统表和数据字典表现 在在MySQL数据目录中 InnoDB 命名 的单个 表空间文件中 创建 mysql.ibd 以前,这些表是 InnoDB mysql 数据库目录 中的各个 表空间文件中 创建的

    • MySQL 8.0中引入了以下撤消表空间更改:

      • 缺省情况下,undo logs现在驻留在MySQL实例初始化时创建的两个undo表空间中。 系统表空间中不再创建撤消日志。

      • 从MySQL 8.0.14开始,可以使用 CREATE UNDO TABLESPACE 语法 在运行时在选定的位置创建其他撤消表空间

        创建UNDO TABLESPACE tablespace_name添加数据文件' file_name.ibu';
        

        CREATE UNDO TABLESPACE 可以 使用 语法在运行时删除 使用 语法 创建的撤消表空间 DROP UNDO TABLESPACE

        DROP UNDO TABLESPACE tablespace_name;
        

        ALTER UNDO TABLESPACE 语法可用于将撤消表空间标记为活动或非活动。

        ALTER UNDO TABLESPACE tablespace_nameSET {ACTIVE | INACTIVE};     
        

        STATE ,显示了表空间的状态列被添加到 INFORMATION_SCHEMA.INNODB_TABLESPACES 表中。 撤消表空间必须处于 empty 可以删除之前 状态。

      • innodb_undo_log_truncate 默认情况下启用 变量。

      • innodb_rollback_segments 变量定义每个撤消表空间的回滚段数。 以前, innodb_rollback_segments 指定了MySQL实例的回滚段总数。 此更改会增加可用于并发事务的回滚段数。 更多回滚段增加了并发事务使用单独的回滚段进行撤消日志的可能性,从而减少了资源争用。

    • 影响缓冲池预冲洗和刷新行为的变量的默认值已修改:

      • innodb_max_dirty_pages_pct_lwm 默认值现在是10。0先前的默认值禁用缓冲池预冲洗。 当缓冲池中脏页的百分比超过10%时,值10将启用预刷。 启用预冲洗可提高性能一致性。

      • innodb_max_dirty_pages_pct 默认值从75到90。增加 InnoDB 尝试从缓冲池刷新数据,使脏页的百分比不超过这个值。 增加的默认值允许缓冲池中较大百分比的脏页。

    • 默认 innodb_autoinc_lock_mode 设置现在为2(交错)。 交错锁定模式允许并行执行多行插入,从而提高了并发性和可伸缩性。 新的 innodb_autoinc_lock_mode 默认设置反映了从基于语句的复制到基于行的复制的更改,作为MySQL 5.7中的默认复制类型。 基于语句的复制需要连续的自动增量锁定模式(以前​​的默认值),以确保为给定的SQL语句序列以可预测和可重复的顺序分配自动增量值,而基于行的复制对于SQL语句的执行顺序。 有关更多信息,请参阅 InnoDB AUTO_INCREMENT锁定模式

      对于使用基于语句的复制的系统,新的 innodb_autoinc_lock_mode 默认设置可能会破坏依赖于顺序自动增量值的应用程序。 要恢复以前的默认值,请设置 innodb_autoinc_lock_mode 为1。

    • ALTER TABLESPACE ... RENAME TO 语法 支持重命名通用表空间

    • innodb_dedicated_server 默认情况下禁用 的新 变量可用于 InnoDB 根据服务器上检测到的内存量自动配置以下选项:

      此选项适用于在专用服务器上运行的MySQL服务器实例。 有关更多信息,请参见 第15.8.12节“为专用MySQL服务器启用自动配置”

    • INFORMATION_SCHEMA.INNODB_TABLESPACES_BRIEF 视图为表空间提供空间,名称,路径,标志和空间类型数据 InnoDB

    • 与MySQL捆绑在一起 zlib库 版本从1.2.3版本升级到版本1.2.11。 MySQL在zlib库的帮助下实现压缩。

      如果使用 InnoDB 压缩表,请参见 第2.11.4节“MySQL 8.0中的更改” 以了解相关的升级含义。

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

      在表空间文件中包含SDI数据会增加表空间文件的大小。 SDI记录需要单个索引页面,默认情况下大小为16KB。 但是,SDI数据在存储时会进行压缩,以减少存储空间。

    • InnoDB 存储引擎现在支持原子DDL,这保证了DDL操作要么完全提交或回滚,即使服务器在操作时停止。 有关更多信息,请参见 第13.1.1节“原子数据定义语句支持”

    • 使用该 innodb_directories 选项 在服务器脱机时,可以将表空间文件移动或还原到新位置 有关更多信息,请参见 第15.6.3.8节“在服务器脱机时移动表空间文件”

    • 实施了以下重做日志记录优化:

      • 用户线程现在可以并发写入日志缓冲区而无需同步写入。

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

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

      • 添加了系统变量,用于配置等待刷新重做的用户线程使用旋转延迟:

      • innodb_log_buffer_size 变量现在是动态的,允许在服务器运行时调整日志缓冲区的大小。

      有关更多信息,请参见 第8.5.4节“优化InnoDB重做日志记录”

    • 从MySQL 8.0.12开始,对大对象(LOB)数据的小更新支持撤消日志记录,这样可以提高大小为100字节或更小的LOB更新的性能。 以前,LOB更新的大小至少为一个LOB页面,对于可能只修改几个字节的更新而言,这不是最佳选择。 此增强功能建立在MySQL 8.0.4中为LOB数据的部分更新添加的支持的基础上。

    • 从MySQL 8.0.12开始, ALGORITHM=INSTANT 支持以下 ALTER TABLE 操作:

      • 添加列。 此功能也称为 即时 ADD COLUMN 限制适用。 请参见 第15.12.1节“在线DDL操作”

      • 添加或删除虚拟列。

      • 添加或删除列默认值。

      • 修改 ENUM SET 的定义

      • 更改索引类型。

      • 重命名表格。

      ALGORITHM=INSTANT 支持 修改数据字典中的元数据的操作。 表中没有元数据锁,表数据不受影响,使操作瞬间完成。 如果未明确指定, ALGORITHM=INSTANT 则默认情况下由支持它的操作使用。 如果 ALGORITHM=INSTANT 已指定但不受支持,则操作会立即失败并显示错误。

      有关支持的操作的更多信息 ALGORITHM=INSTANT ,请参见 第15.12.1节“在线DDL操作”

    • 从MySQL 8.0.13开始, TempTable 存储引擎支持二进制大对象(BLOB)类型列的存储。 此增强功能可提高使用包含BLOB数据的临时表的查询的性能。 以前,包含BLOB数据的临时表存储在由...定义的磁盘存储引擎中 internal_tmp_disk_storage_engine 有关更多信息,请参见 第8.4.4节“MySQL中的内部临时表使用”

    • 从MySQL 8.0.13开始,静态 InnoDB 数据加密功能支持通用表空间。 以前,只能对每个表的文件表空间进行加密。 为了支持一般的表空间的加密, CREATE TABLESPACE 以及 ALTER TABLESPACE 语法扩展到包括 ENCRYPTION 条款。

      INFORMATION_SCHEMA.INNODB_TABLESPACES 表现在包含一个 ENCRYPTION 列,指示表空间是否已加密。

      stage/innodb/alter tablespace (encryption) 加入绩效模式阶段仪器允许普通表空间加密操作的监控。

    • innodb_buffer_pool_in_core_file 通过排除 InnoDB 缓冲池页面来 禁用该 变量可以减小核心文件的大小 要使用此变量, core_file 必须启用 该变量, 并且操作系统必须支持 MADV_DONTDUMP 非POSIX扩展 madvise() ,Linux 3.4及更高版本 支持该 扩展 有关更多信息,请参见 第15.8.3.8节“从核心文件中排除缓冲池页面”

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

      innodb_temp_tablespaces_dir 变量定义创建会话临时表空间的位置。 默认位置是 #innodb_temp 数据目录中的目录。

      INNODB_SESSION_TEMP_TABLESPACES 表提供有关会话临时表空间的元数据。

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

    • 从MySQL 8.0.14开始, InnoDB 支持并行聚簇索引读取,这可以提高 CHECK TABLE 性能。 此功能不适用于二级索引扫描。 innodb_parallel_read_threads 会话变量必须被设置为一个大于1的值用于并行聚簇索引读取发生。 默认值为4.用于执行并行聚簇索引读取的实际线程 innodb_parallel_read_threads 数由要扫描的索引子树 设置或数量决定,取较小者。

    • 从8.0.14开始,当 innodb_dedicated_server 启用变量 ,将根据自动配置的缓冲池大小配置日志文件的大小和数量。 以前,根据服务器上检测到的内存量配置日志文件大小,并且未自动配置日志文件的数量。

    • 从8.0.14开始,该 语句 ADD DATAFILE 子句 CREATE TABLESPACE 是可选的,它允许没有 FILE 权限的 用户 创建表空间。 CREATE TABLESPACE 没有 ADD DATAFILE 子句的 情况下执行的 语句会隐式创建具有唯一文件名的表空间数据文件。

    • 默认情况下,当TempTable存储引擎占用的内存量超过 temptable_max_ram 变量 定义的内存限制时 ,TempTable存储引擎开始从磁盘分配内存映射的临时文件。 从MySQL 8.0.16开始,此行为由 temptable_use_mmap 变量 控制 禁用 temptable_use_mmap 会导致TempTable存储引擎使用 InnoDB 磁盘内部临时表而不是内存映射文件作为其溢出机制。 有关更多信息,请参阅 内部临时表存储引擎

    • 从MySQL 8.0.16开始,静态 InnoDB 数据加密功能支持加密 mysql 系统表空间。 mysql 系统表空间包含 mysql 系统数据库和MySQL数据字典表。 有关更多信息,请参见 第15.6.3.9节“InnoDB静态数据加密”

    • innodb_spin_wait_pause_multiplier MySQL 8.0.16中引入 变量可以更好地控制线程等待获取互斥锁或rw-lock时发生的自旋锁定轮询延迟的持续时间。 可以更精细地调整延迟,以解决不同处理器体系结构上PAUSE指令持续时间的差异。 有关更多信息,请参见 第15.8.8节“配置自旋锁轮询”

  • 字符集支持。  默认字符集已从更改 latin1 utf8mb4 utf8mb4 字符集有几个新的排序规则,包括 utf8mb4_ja_0900_as_cs MySQL中可用于Unicode的第一个日语特定排序规则。 有关更多信息,请参见 第10.10.1节“Unicode字符集”

  • JSON增强功能。  对MySQL的JSON功能进行了以下增强或添加:

    • 添加了 ->> (内联路径)运算符,相当于调用 JSON_UNQUOTE() 结果 JSON_EXTRACT()

      这是 -> MySQL 5.7中引入 的列路径运算符的改进 ; col->>"$.path" 相当于 JSON_UNQUOTE(col->"$.path") 内联路径运算符可以用来随时随地可以使用 JSON_UNQUOTE(JSON_EXTRACT()) ,如 SELECT 列清单, WHERE HAVING 条款,并 ORDER BY GROUP BY 条款。 有关更多信息,请参阅运算符的说明以及 JSON路径语法

    • 添加了两个JSON聚合函数 JSON_ARRAYAGG() JSON_OBJECTAGG() JSON_ARRAYAGG() 将列或表达式作为其参数,并将结果聚合为单个 JSON 数组。 表达式可以评估任何MySQL数据类型; 这不一定是一个 JSON 价值。 JSON_OBJECTAGG() 采用两个列或表达式,它将其解释为键和值; 它将结果作为单个 JSON 对象 返回 有关更多信息和示例,请参见 第12.20节“聚合(GROUP BY)函数”

    • 添加了JSON实用程序功能 JSON_PRETTY() JSON 以易于阅读的格式 输出现有 值; 每个JSON对象成员或数组值都打印在一个单独的行上,子对象或数组相对于其父对象是2个空格。

      此函数也适用于可以解析为JSON值的字符串。

      有关更多详细信息和示例,请参见 第12.17.8节“JSON实用程序函数”

    • JSON 在使用查询 值进行 排序时 ORDER BY ,每个值现在由排序键的可变长度部分表示,而不是固定1K大小的一部分。 在许多情况下,这可以减少过度使用。 例如,标量 INT 或偶 BIGINT 数值实际上只需要很少的字节,因此通过填充占用了该空间的剩余部分(最多90%或更多)。 此更改对性能具有以下好处:

      • 现在可以更有效地使用排序缓冲区空间,因此filesorts不需要尽早或通常使用固定长度排序键刷新到磁盘。 这意味着可以在内存中分类更多数据,从而避免不必要的磁盘访问。

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

    • 在MySQL 8.0.2中添加了对 JSON 列值的 部分,就地更新的支持 ,这比完全删除现有JSON值并在其位置编写新值更有效,就像之前更新任何 JSON 时所做的那样 要应用这种优化,更新,必须使用应用 JSON_SET() JSON_REPLACE() JSON_REMOVE() 无法将新元素添加到正在更新的JSON文档中; 文档中的值不会占用比更新前更多的空间。 请参阅 JSON值的部分更新 ,详细讨论要求。

      可以将JSON文档的部分更新写入二进制日志,占用的空间比记录完整的JSON文档少。 在使用基于语句的复制时,始终会记录部分更新。 要使其与基于行的复制一起使用,必须先设置 binlog_row_value_options=PARTIAL_JSON ; 有关更多信息,请参阅此变量的说明。

    • 添加了JSON实用程序函数 JSON_STORAGE_SIZE() JSON_STORAGE_FREE() JSON_STORAGE_SIZE() 在任何部分更新之前,返回用于JSON文档的二进制表示的字节存储空间(请参阅上一项)。 JSON_STORAGE_FREE() 显示 JSON 使用 JSON_SET() 部分更新后 的表格列中剩余的空间量 JSON_REPLACE() ; 如果新值的二进制表示小于先前值的二进制表示,则大于零。

      这些函数中的每一个也接受JSON文档的有效字符串表示。 对于这样的值, JSON_STORAGE_SIZE() 返回其转换为JSON文档后其二进制表示所使用的空间。 对于包含JSON文档的字符串表示形式的变量, JSON_STORAGE_FREE() 返回零。 如果无法将其(非null)参数解析为有效的JSON文档,并且 NULL 参数为 任一函数都会产生错误 NULL

      有关更多信息和示例,请参见 第12.17.8节“JSON实用程序函数”

      JSON_STORAGE_SIZE() JSON_STORAGE_FREE() 在MySQL 8.0.2中实现。

    • 在MySQL 8.0.2中添加了对 $[1 to 5] XPath表达式 等范围的支持 此版本还为 last 关键字和相对寻址 添加了支持 ,以便 $[last] 始终选择数组中的最后一个(编号最大的)元素和 $[last-1] 倒数第二个元素。 last 和使用它的表达式也可以包含在范围定义中。 例如, $[last-2 to last-1] 返回最后两个元素,但返回一个数组。 有关 其他信息和示例, 请参阅 搜索和修改JSON值

    • 添加了旨在符合 RFC 7396 的JSON合并功能 JSON_MERGE_PATCH() ,当在2个JSON对象上使用时,将它们合并为单个JSON对象,该对象具有以下集合的成员作为成员:

      • 第一个对象的每个成员,在第二个对象中没有成员具有相同的键。

      • 第二个对象的每个成员,其中没有成员在第一个对象中具有相同的键,并且其值不是JSON null 文字。

      • 每个成员都有一个存在于两个对象中的键,并且其第二个对象中的值不是JSON null 文字。

      作为此工作的一部分,该 JSON_MERGE() 功能已重命名 JSON_MERGE_PRESERVE() JSON_MERGE() 继续被认为是 JSON_MERGE_PRESERVE() MySQL 8.0中 的别名 ,但现在已被弃用,并且将在未来版本的MySQL中删除。

      有关更多信息和示例,请参见 第12.17.4节“修改JSON值的函数”

    • 实现了 最后重复密钥获胜 重复密钥的规范化,与 RFC 7159 和大多数JavaScript解析器一致。 此处显示了此行为的示例,其中仅 x 保留 具有密钥的最右侧成员

      mysql> SELECT JSON_OBJECT('x', '32', 'y', '[true, false]', 
           >                     'x', '"abc"', 'x', '100') AS Result;
      + ------------------------------------ +
      | 结果|
      + ------------------------------------ +
      | {“x”:“100”,“y”:“[true,false]”} |
      + ------------------------------------ +
      1排(0.00秒)
      

      插入到MySQL JSON 列中的 也以这种方式标准化,如下例所示:

      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不兼容的变化, 在这种情况下使用 第一次重复密钥获胜 算法。

      有关 更多信息和示例 请参阅 JSON值的规范化,合并和自动包装

    • JSON_TABLE() 在MySQL 8.0.4中 添加了该 功能。 此函数接受JSON数据并将其作为具有指定列的关系表返回。

      此函数具有语法 ,其中 是返回JSON数据的表达式, 是应用于源的JSON路径, 是列定义的列表。 这里显示了一个例子: JSON_TABLE(expr, path COLUMNS column_list) [AS] alias) expr path column_list

      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 | 某人| 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_EXTRACT(t1, data, '$.post.comments') 有关更多信息,请参见 第12.17.6节“JSON表函数”

  • 数据类型支持。  MySQL现在支持将表达式用作数据类型规范中的默认值。 这包括使用表达式作为默认值 BLOB TEXT GEOMETRY ,和 JSON 数据类型,这在以前是根本不会被分配缺省值。 有关详细信息,请参见 第11.7节“数据类型默认值”

  • 优化。  添加了以下优化程序增强功能:

    • MySQL现在支持隐形索引。 优化器根本不使用不可见索引,但以其他方式正常维护。 默认情况下,索引是可见的。 不可见索引可以测试删除索引对查询性能的影响,而不会进行破坏性更改,如果索引需要,则必须撤消。 请参见 第8.3.12节“不可见索引”

    • MySQL现在支持降序索引: DESC 在索引定义中不再被忽略,但会导致按键降序存储键值。 以前,索引可能会以相反的顺序扫描,但性能会受到影响。 可以按正向顺序扫描降序索引,这样更有效。 当最有效的扫描顺序混合某些列的升序和其他列的降序时,降序索引还使优化器可以使用多列索引。 请参见 第8.3.13节“降序索引”

    • MySQL现在支持创建索引表达式值而不是列值的功能索引键部分。 功能键部件支持索引无法索引的值,例如 JSON 值。 有关详细信息,请参见 第13.1.15节“CREATE INDEX语法”

    • 在MySQL 8.0.14及更高版本中, WHERE 由常量文字表达式引起的 微不足道的 条件在准备期间被删除,而不是在优化期间被删除。 在过程的早期删除条件使得可以简化具有微不足道条件的外连接的查询的连接,例如:

      SELECT * FROM t1 LEFT JOIN t2 ON condition_1WHERE condition_2OR 0 = 1
      

      优化器现在在准备期间看到0 = 1始终为false,使得 OR 0 = 1 冗余,并将其删除,留下:

      SELECT * FROM t1 LEFT JOIN t2 ON condition_1在哪里condition_2
      

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

      SELECT * FROM t1 LEFT JOIN t2 WHERE condition_1ANDcondition_2
      

      有关更多信息,请参见 第8.2.1.8节“外部连接优化”

    • 在MySQL 8.0.16及更高版本中,MySQL可以在优化时使用常量折叠来处理列和常量值之间的比较,其中常量超出范围或相对于列的类型在范围边界上,而不是所以对于执行时的每一行。 例如,给定一个表 t TINYINT UNSIGNED c ,优化器可以改写的条件如 WHERE c < 256 WHERE 1 (和远离共优化条件),或 WHERE c >= 255 WHERE c = 255

      有关 更多信息 请参见 第8.2.1.13节“常量折叠优化”

    • 从MySQL 8.0.16开始,用于 IN 子查询 的半连接优化 现在也可以应用于 EXISTS 子查询。 此外,优化器现在在 WHERE 附加到子查询 条件 中对与之相关的等式谓词进行去相关 ,以便可以像处理 IN 子查询中的 表达式一样对待它们 这适用于两个 EXISTS IN 子查询。

      有关更多信息,请参见 第8.2.2.1节“使用半连接转换优化子查询,派生表,视图引用和公用表表达式”

  • 公用表表达式。  MySQL现在支持非递归和递归的公用表表达式。 公用表表达式允许使用命名的临时结果集,通过允许 WITH 语句之前 子句 SELECT 和某些其他语句来实现。 有关更多信息,请参见 第13.2.13节“WITH语法(公用表表达式)”

  • 窗口功能。  MySQL现在支持窗口函数,对于查询中的每一行,它使用与该行相关的行执行计算。 这些包括诸如 RANK() LAG() ,和 NTILE() 此外,现在可以将几个现有的聚合函数用作窗口函数(例如, SUM() AVG() )。 有关更多信息,请参见 第12.21节“窗口函数”

  • 横向派生表。  现在,派生表可以在 LATERAL 关键字 前面 指定允许在同一 FROM 子句中 引用(依赖于)前面表的列 横向派生表使得某些SQL操作成为可能,这些操作无法使用非边缘派生表或需要效率较低的变通方法。 请参见 第13.2.11.9节“横向派生表”

  • 单表DELETE语句中的别名。  在MySQL 8.0.16及更高版本中,单表 DELETE 语句支持使用表别名。

  • 正则表达式支持。  以前,MySQL使用Henry Spencer正则表达式库来支持正则表达式运算符( REGEXP RLIKE )。 正则表达式支持已使用国际Unicode组件(ICU)重新实现,它提供完整的Unicode支持并且是多字节安全的。 REGEXP_LIKE() 函数以 REGEXP RLIKE 运算符 的方式执行正则表达式匹配,这些 运算符现在是该函数的同义词。 此外, REGEXP_INSTR() REGEXP_REPLACE() ,和 REGEXP_SUBSTR() 函数可用于查找匹配位置并分别执行子串替换和提取。 regexp_stack_limit regexp_time_limit 系统变量提供了通过发动机匹配的资源消耗的控制。 有关更多信息,请参见 第12.5.2节“正则表达式” 有关使用正则表达式的应用程序可能受实现更改影响的方式的信息,请参阅 正则表达式兼容性注意事项

  • 内部临时表。  TempTable 存储引擎替换 MEMORY 存储引擎作为默认发动机用于在内存中的内部临时表。 TempTable 存储引擎提供了有效的存储 VARCHAR VARBINARY 列。 internal_tmp_mem_storage_engine 会话变量定义了用于在存储器内的临时表的存储引擎。 允许的值是 TempTable (默认值)和 MEMORY temptable_max_ram 变量定义了 TempTable 存储引擎在将数据存储到磁盘之前可以使用 的最大内存量

  • 日志记录。  重写错误日志记录以使用MySQL组件体系结构。 传统错误日志记录使用内置组件实现,使用系统日志进行日志记录实现为可加载组件。 此外,还提供可加载的JSON日志写入程序。 要控制要启用的日志组件,请使用 log_error_services 系统变量。 有关更多信息,请参见 第5.4.2节“错误日志”

  • 备份锁。  新类型的备份锁在联机备份期间允许DML,同时防止可能导致快照不一致的操作。 新的备份锁由 LOCK INSTANCE FOR BACKUP UNLOCK INSTANCE 语法 支持 BACKUP_ADMIN 权限才能使用这些语句。

  • 复制。  对MySQL Replication进行了以下增强:

    • MySQL Replication现在支持使用紧凑的二进制格式对JSON文档的部分更新进行二进制日志记录,从而节省了日志记录完整JSON文档的空间。 当使用基于语句的日志记录时,这种紧凑日志记录会自动完成,并且可以通过将新 binlog_row_value_options 系统变量 设置为来启用 PARTIAL_JSON 有关更多信息,请参阅 JSON值的部分更新 以及 binlog_row_value_options

  • 连接管理。  MySQL服务器现在允许专门为管理连接配置TCP / IP端口。 这提供了用于普通连接的网络接口上允许的单个管理连接的替代方案,即使 max_connections 已建立连接也是如此。 请参见 第8.12.4.1节“MySQL如何处理客户端连接”

  • 组态。  MySQL中主机名的最大允许长度已增加到255个ASCII字符,高于之前的60个字符的限制。 例如,这适用于数据字典中的主机名相关列, mysql 系统架构,性能架构 INFORMATION_SCHEMA sys 架构; 声明 MASTER_HOST 价值 CHANGE MASTER TO ; 语句输出中 Host SHOW PROCESSLIST ; 帐户名中的主机名(例如在帐户管理语句和帐户中使用) DEFINER 属性); 和主机名相关的命令选项和系统变量。

    注意事项:

    • 允许的主机名长度的增加可能会影响主机名列上具有索引的表。 例如, mysql 系统架构中索引主机名的表现在具有显式 ROW_FORMAT 属性, DYNAMIC 以容纳更长的索引值。

    • 可以基于服务器主机名构造一些文件名值配置设置。 允许的值受底层操作系统的约束,这可能不允许文件名长到足以包含255个字符的主机名。 这会影响到 general_log_file log_error pid_file relay_log ,和 slow_query_log_file 系统变量和相应的选项。 如果操作系统的基于主机名的值太长,则必须提供明确的较短值。

    • 尽管服务器现在支持255个字符的主机名,但使用该 --ssl-mode=VERIFY_IDENTITY 选项 建立的服务器的连 接受OpenSSL支持的最大主机名长度的限制。 主机名匹配属于两个SSL证书字段,其最大长度如下:公共名称:最大长度64; 主题备选名称:根据RFC#1034的最大长度。

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

  • C API。  MySQL C API现在支持用于与MySQL服务器进行非阻塞通信的异步函数。 每个函数都是现有同步函数的异步函数。 如果对服务器连接的读取或写入必须等待,则同步功能将阻塞。 异步功能使应用程序能够检查服务器连接上的工作是否准备好继续。 如果没有,应用程序可以执行其他工作,然后再次检查。 请参见 第28.7.12节“C API异步接口”

  • 演员的其他目标类型。  功能 CAST() CONVERT() 现在支持转换到类型 DOUBLE FLOAT REAL 在MySQL 8.0.17中添加。 请参见 第12.10节“强制转换函数和运算符”

  • JSON模式验证。  MySQL 8.0.17添加了两个函数 JSON_SCHEMA_VALID() JSON_SCHEMA_VALIDATION_REPORT() 用于再次验证JSON文档的JSON模式。 JSON_SCHEMA_VALID() 如果文档针对模式进行验证,则返回TRUE(1);如果不是,则返回FALSE(0)。 JSON_SCHEMA_VALIDATION_REPORT() 返回一个JSON文档,其中包含有关验证结果的详细信息。 以下陈述适用于这两个功能:

    • 架构必须符合JSON Schema规范的草案4。

    • required 支持属性。

    • $ref 不支持 外部资源和 关键字。

    • 支持正则表达式模式; 无效模式会被忽略。

    有关 更多信息和示例, 请参见 第12.17.7节“JSON模式验证函数”

    JSON_OVERLAPS()和成员()。  MySQL 8.0还提供了用于获取有关JSON文档内容的信息的附加功能。 JSON_OVERLAPS() 函数比较两个JSON对象或数组,如果它们包含任何共同的键值对或数组元素,则返回true(1),如果不包含,则返回false(0)。 MEMBER OF() 运算符返回真(1)如果给定的值存在作为指定数组的一个元素,假(0),如果它没有。 这两个都可以在MySQL 8.0.17及更高版本中使用。 有关更多信息和示例,请参见 第12.17.3节“搜索JSON值的函数”

  • hintable time_zone。  从MySQL 8.0.17开始, time_zone 会话变量是可以使用的 SET_VAR

功能在MySQL 8.0中不推荐使用

MySQL 8.0中不推荐使用以下功能,可能会在将来的系列中删除。 在显示替代方案的地方,应更新应用程序以使用它们。

对于使用MySQL 8.0中已弃用的功能的应用程序,这些功能已在较高的MySQL系列中删除,从MySQL 8.0主服务器复制到更高级别的从服务器时语句可能会失败,或者可能对主服务器和从服务器产生不同的影响。 为避免此类问题,应修改使用8.0中不推荐使用的功能的应用程序,以避免它们并尽可能使用替代方案。

  • utf8mb3 不推荐使用 字符集。 utf8mb4 改用。

  • 因为它 caching_sha2_password 是MySQL 8.0中的默认身份验证插件并提供了 sha256_password 身份验证插件 功能的超集 sha256_password 所以不推荐使用,并且将在未来的MySQL版本中删除。 sha256_password 应该迁移使用 身份验证的MySQL帐户 以使用 caching_sha2_password

  • validate_password 插件已重新实现以使用服务器组件基础结构。 插件形式 validate_password 仍然可用,但已弃用,将在未来的MySQL版本中删除。 使用该插件的MySQL安装应该转换为使用该组件。 请参见 第6.4.3.3节“转换到密码验证组件”

  • ALTER TABLESPACE 条款已被弃用。 DROP TABLESPACE ENGINE

  • PAD_CHAR_TO_FULL_LENGTH SQL模式已经过时了。

  • AUTO_INCREMENT 对于类型 FLOAT DOUBLE (以及任何同义词)的 列,不建议使用支持 考虑 AUTO_INCREMENT 从这些列中 删除 属性,或将它们转换为整数类型。

  • UNSIGNED 属性被弃用类型的列 FLOAT DOUBLE DECIMAL (和任何同义词)。 考虑使用简单 CHECK 约束代替此类列。

  • FLOAT(M,D) 指定类型列 (和任何同义词) 列的位数的语法 是非标准的MySQL扩展。 不推荐使用此语法。 DOUBLE(M,D) FLOAT DOUBLE

  • ZEROFILL 属性是不鼓励数值数据类型,如对于整数数据类型的显示宽度属性。 考虑使用另一种方法来产生这些属性的效果。 例如,应用程序可以使用该 LPAD() 函数将数字填充到所需的宽度,或者它们可以将格式化的数字存储在 CHAR 列中。

  • 对于字符串数据类型,该 BINARY 属性是非标准的MySQL扩展,它是指定 _bin 列字符集(如果未指定列字符集,则为表默认字符集) 的二进制( )排序规则的 简写 在MySQL 8.0中,这种非标准使用 BINARY 是不明确的,因为 utf8mb4 字符集具有多个 _bin 排序规则,因此 BINARY 不推荐使用 属性,并且在将来的MySQL版本中将删除 对该 属性的支持。 应调整应用程序以使用显式 _bin 排序规则。

    BINARY 指定数据类型或字符集 的用法 保持不变。

  • 非标准C风格 && || ! 运营商认为是标准的SQL同义词 AND OR NOT 运营商,分别已被取消。 应调整使用非标准运算符的应用程序以使用标准运算符。

    注意

    使用的 || ,除非被弃用 PIPES_AS_CONCAT 启用SQL模式。 在这种情况下, || 表示SQL标准字符串连接运算符)。

  • JSON_MERGE() 函数已弃用。 JSON_MERGE_PRESERVE() 改用。

  • SQL_CALC_FOUND_ROWS 查询修改和相应的 FOUND_ROWS() 功能已被弃用。 有关 FOUND_ROWS() 替代策略的信息, 请参阅 说明。

  • 自MySQL 8.0.13起,不推荐使用对 支持 TABLESPACE = innodb_file_per_table TABLESPACE = innodb_temporary 子句的 支持 CREATE TEMPORARY TABLE

  • mysql_upgrade 客户端已被弃用,因为它的功能升级的系统表 mysql 系统架构和对象在其他模式已移动到MySQL服务器。 请参见 第2.11.3节“MySQL升级过程升级”

  • --no-dd-upgrade 服务器选项已被弃用。 它被该 --upgrade 选项 取代,该 选项可以更好地控制数据字典和服务器升级行为。

  • mysql_upgrade_info 文件是创建的数据目录,用于存储MySQL版本号,不推荐使用,将在以后的MySQL版本中删除。

MySQL 8.0中删除的功能

以下项目已过时,已在MySQL 8.0中删除。 在显示替代方案的地方,应更新应用程序以使用它们。

对于使用MySQL 8.0中删除的功能的MySQL 5.7应用程序,从MySQL 5.7主服务器复制到MySQL 8.0从服务器时语句可能会失败,或者可能对主服务器和从服务器产生不同的影响。 为避免此类问题,应修改使用MySQL 8.0中删除的功能的应用程序以避免它们并尽可能使用备选方案。

  • innodb_locks_unsafe_for_binlog 除去系统变量。 READ COMMITTED 隔离级别提供了类似的功能。

  • information_schema_stats MySQL 8.0.0中引入 变量已被删除,并 information_schema_stats_expiry 在MySQL 8.0.3中 替换

    information_schema_stats_expiry 定义缓存 INFORMATION_SCHEMA 表统计信息 的到期设置 有关更多信息,请参见 第8.2.3节“优化INFORMATION_SCHEMA查询”

  • InnoDB 在MySQL 8.0.3中删除了 与已废弃 系统表 相关的代码 INFORMATION_SCHEMA 基于 InnoDB 系统表的视图被数据字典表上的内部系统视图替换。 受影响的 InnoDB INFORMATION_SCHEMA 视图已重命名:

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

    旧名 新名字
    INNODB_SYS_COLUMNS INNODB_COLUMNS
    INNODB_SYS_DATAFILES INNODB_DATAFILES
    INNODB_SYS_FIELDS INNODB_FIELDS
    INNODB_SYS_FOREIGN INNODB_FOREIGN
    INNODB_SYS_FOREIGN_COLS INNODB_FOREIGN_COLS
    INNODB_SYS_INDEXES INNODB_INDEXES
    INNODB_SYS_TABLES INNODB_TABLES
    INNODB_SYS_TABLESPACES INNODB_TABLESPACES
    INNODB_SYS_TABLESTATS INNODB_TABLESTATS
    INNODB_SYS_VIRTUAL INNODB_VIRTUAL

    升级到MySQL 8.0.3或更高版本后,更新引用先前 InnoDB INFORMATION_SCHEMA 视图名称的 所有脚本

  • 删除了与帐户管理相关的以下功能:

    • 使用 GRANT 创建用户。 相反,使用 CREATE USER 遵循这种做法使得 NO_AUTO_CREATE_USER SQL模式对于 GRANT 语句来说 无关紧要 ,因此它也被删除了。

    • 使用 GRANT 修改不是权限指派其他帐户属性。 这包括身份验证,SSL和资源限制属性。 相反,在帐户创建时建立这样的属性, CREATE USER 然后用它们修改它们 ALTER USER

    • IDENTIFIED BY PASSWORD 'auth_string' CREATE USER 和的 语法 GRANT 相反,使用 for ,其中 值是与指定插件兼容的格式。 IDENTIFIED WITH auth_plugin AS 'auth_string' CREATE USER ALTER USER 'auth_string'

      此外,由于 IDENTIFIED BY PASSWORD 语法被删除, log_builtin_as_identified_by_password 系统变量是多余的并被删除。

    • PASSWORD() 功能。 此外, PASSWORD() 删除意味着 语法不再可用。 SET PASSWORD ... = PASSWORD('auth_string')

    • old_passwords 系统变量。

  • 查询缓存已删除。 删除包括以下项目:

    这些已弃用的查询缓存项目仍然不推荐使用,但不起作用,将在以后的MySQL版本中删除:

    • SQL_NO_CACHE SELECT 修改。

    • ndb_cache_check_time 系统变量。

    have_query_cache 系统变量仍然是过时的,总是有一个值 NO ,并会在将来的MySQL版本中删除。

  • 数据字典提供有关数据库对象的信息,因此服务器不再检查数据目录中的目录名以查找数据库。 因此, --ignore-db-dir 选项和 ignore_db_dirs 系统变量是无关的并被删除。

  • tx_isolation tx_read_only 系统变量已被删除。 使用 transaction_isolation transaction_read_only 替代。

  • sync_frm 系统变量已被删除,因为 .frm 文件已经过时。

  • secure_auth 系统变量和 --secure-auth 客户端选项已被删除。 已删除C API函数 MYSQL_SECURE_AUTH 选项 mysql_options()

  • multi_range_count 系统变量被移除。

  • log_warnings 系统变量和 --log-warnings 服务器选项已被删除。 请改用 log_error_verbosity 系统变量。

  • sql_log_bin 删除 系统变量 的全局范围 sql_log_bin 只有会话范围, @@GLOBAL.sql_log_bin 应该调整 依赖访问的应用程序

  • metadata_locks_cache_size metadata_locks_hash_instances 系统变量被删除。

  • 未使用 date_format datetime_format time_format ,和 max_tmp_tables 系统变量被删除。

  • 这些弃用兼容性SQL模式被移除: DB2 MAXDB MSSQL MYSQL323 MYSQL40 ORACLE POSTGRESQL NO_FIELD_OPTIONS NO_KEY_OPTIONS NO_TABLE_OPTIONS 它们不能再分配给 sql_mode 系统变量或用作 mysqldump --compatible 选项的 允许值

    删除 MAXDB 意味着 TIMESTAMP 数据类型为 CREATE TABLE 或被 ALTER TABLE 视为 TIMESTAMP ,并且不再被视为 DATETIME

  • 删除的子句 的已弃用 ASC DESC 限定符 GROUP BY 以前依赖于 GROUP BY 排序的 查询 可能会产生与以前的MySQL版本不同的结果。 要生成给定的排序顺序,请提供一个 ORDER BY 子句。

  • 语句 EXTENDED PARTITIONS 关键字 EXPLAIN 已被删除。 这些关键字是不必要的,因为它们的效果总是启用

  • 这些与加密相关的项目已删除:

    取代已删除的加密函数:对于 ENCRYPT() ,请考虑使用 SHA2() 单向散列。 对于其他人,请考虑使用 AES_ENCRYPT() AES_DECRYPT() 不是。

  • 在MySQL 5.7中,不推荐使用多个名称下的几个空间函数,以便使空间函数名称空间更加一致,目标是每个空间函数名称 ST_ 在执行精确操作时开始,或者 MBR 如果它执行了基于最小边界矩形的操作。 在MySQL 8.0中,删除了不推荐使用的函数,只留下相应的 函数 ST_ MBR 函数:

    • 这些功能有利于去除的 MBR 名字: Contains() Disjoint() Equals() Intersects() Overlaps() Within()

    • 这些功能有利于去除的 ST_ 名字: Area() AsBinary() AsText() AsWKB() AsWKT() Buffer() Centroid() ConvexHull() Crosses() Dimension() Distance() EndPoint() Envelope() ExteriorRing() GeomCollFromText() GeomCollFromWKB() GeomFromText() GeomFromWKB() GeometryCollectionFromText() GeometryCollectionFromWKB() GeometryFromText() GeometryFromWKB() GeometryN() GeometryType() InteriorRingN() IsClosed() IsEmpty() IsSimple() LineFromText() LineFromWKB() LineStringFromText() LineStringFromWKB() MLineFromText() MLineFromWKB() MPointFromText() MPointFromWKB() MPolyFromText() MPolyFromWKB() MultiLineStringFromText() MultiLineStringFromWKB() MultiPointFromText() MultiPointFromWKB() MultiPolygonFromText() MultiPolygonFromWKB() NumGeometries() NumInteriorRings() NumPoints() PointFromText() PointFromWKB() PointN() PolyFromText() PolyFromWKB() PolygonFromText() PolygonFromWKB() SRID() StartPoint() Touches() X() Y()

    • GLength() 被删除有利于 ST_Length()

  • 第12.16.4节“从WKB值创建几何值 的函数”中描述的函数 以前接受WKB字符串或几何参数。 不再允许使用几何参数并产生错误。 有关使用几何参数迁移查询的指南,请参阅该部分。

  • 解析器不再被视为 SQL语句中 \N 的同义词 NULL NULL 改用。

    这种变化并不影响执行文本文件导入和导出操作 LOAD DATA SELECT ... INTO OUTFILE 用于其 NULL 继续受到代表 \N 请参见 第13.2.7节“LOAD DATA语法”

  • PROCEDURE ANALYSE() 语法被删除。

  • 客户端 --ssl --ssl-verify-server-cert 选项已被删除。 使用 --ssl-mode=REQUIRED 而不是 --ssl=1 --enable-ssl 使用 --ssl-mode=DISABLED 替代 --ssl=0 --skip-ssl --disable-ssl 使用 --ssl-mode=VERIFY_IDENTITY 而不是 --ssl-verify-server-cert 选项。 (服务器端 --ssl 选项保持不变。)

    对于C API, MYSQL_OPT_SSL_ENFORCE 以及 MYSQL_OPT_SSL_VERIFY_SERVER_CERT 选项 mysql_options() 对应于客户端 --ssl --ssl-verify-server-cert 选项和被去除。 使用 MYSQL_OPT_SSL_MODE 选项值 SSL_MODE_REQUIRED SSL_MODE_VERIFY_IDENTITY 代替。

  • --temp-pool 移除服务器选项。

  • 删除 --ignore-builtin-innodb 服务器选项和 ignore_builtin_innodb 系统变量。

  • 服务器不再通过添加 #mysql50# 前缀 将包含特殊字符的MySQL 5.1之前的数据库名称转换为5.1格式 由于不再执行这些转换,因此将 删除mysqlcheck 和语句 子句 以及 状态变量的 选项 --fix-db-names --fix-table-names 选项 UPGRADE DATA DIRECTORY NAME ALTER DATABASE Com_alter_db_upgrade

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

  • mysql_install_db的 计划已经从MySQL分发中删除。 应该通过 使用 选项 调用 mysqld 来执行数据目录初始化 此外, 删除 mysql_install_db 使用的 mysqld 选项, 并删除 了控制 mysql_install_db 的安装位置的 选项 --initialize --initialize-insecure --bootstrap INSTALL_SCRIPTDIR CMake

  • 通用分区处理程序已从MySQL服务器中删除。 为了支持给定表的分区,用于表的存储引擎现在必须提供其自己的( 本机 )分区处理程序。 --partition --skip-partition 选项从MySQL服务器删除,分区相关条目中的输出不再显示 SHOW PLUGINS 或在 INFORMATION_SCHEMA.PLUGINS 表中。

    两个MySQL存储引擎目前提供原生支持-分区 InnoDB NDB ; 其中,仅 InnoDB 在MySQL 8.0中受支持。 任何使用任何其他存储引擎在MySQL 8.0中创建分区表的尝试都会失败。

    升级的分歧。  不支持 使用除 MySQL(或更早版本) 之外的存储引擎 InnoDB (例如 MyISAM )到MySQL 8.0 的直接升级分区表 处理这样一个表有两种选择:

    InnoDB 将服务器升级到MySQL 8.0之前, 必须为每个分区的非 执行刚刚列出的两个操作中的至少一个 否则,升级后无法使用此类表。

    由于表创建语句导致使用没有分区支持的存储引擎的分区表现在失败并出现错误( ER_CHECK_NOT_IMPLEMENTED ),因此必须确保转储文件中的任何语句(例如 mysqldump 编写的语句 )从您希望导入到创建分区表的MySQL 8.0服务器的旧版MySQL中,不会指定存储引擎,例如 MyISAM 没有本机分区处理程序 的存储引擎 您可以通过执行以下任一操作来执行此操作:

    • 从除 CREATE TABLE 使用除 STORAGE ENGINE 选项之外 的值的语句中 删除对分区的任何引用 InnoDB

    • 默认情况下 InnoDB 将存储引擎指定为 或允许 InnoDB 用作表的存储引擎。

    有关更多信息,请参见 第23.6.2节“分区与存储引擎相关的限制”

  • 系统和状态变量信息不再保留在 INFORMATION_SCHEMA 这些表被删除: GLOBAL_VARIABLES SESSION_VARIABLES GLOBAL_STATUS SESSION_STATUS 请改用相应的Performance Schema表。 请参见 第26.12.13节“性能模式系统变量表” 第26.12.14节“性能模式状态变量表” 此外, show_compatibility_56 系统变量已被删除。 它用于过渡期间系统和状态变量信息 INFORMATION_SCHEMA 表已移至Performance Schema表,不再需要。 这些状态变量被删除: Slave_heartbeat_period Slave_last_heartbeat Slave_received_heartbeats Slave_retried_transactions Slave_running 它们提供的信息可在性能模式表中找到; 请参阅 迁移到性能架构系统和状态变量表

  • setup_timers 删除了 性能架构 表,表中的 TICK 行也是如此 performance_timers

  • libmysqld 嵌入式服务器库被删除,连同:

    • ,和 选项 mysql_options() MYSQL_OPT_GUESS_CONNECTION MYSQL_OPT_USE_EMBEDDED_CONNECTION MYSQL_OPT_USE_REMOTE_CONNECTION MYSQL_SET_CLIENT_IP

    • mysql_config --libmysqld-libs --embedded-libs --embedded 选项

    • CMake的 WITH_EMBEDDED_SERVER WITH_EMBEDDED_SHARED_LIBRARY INSTALL_SECURE_FILE_PRIV_EMBEDDEDDIR 选项

    • (未记录的) mysql --server-arg 选项

    • mysqltest --embedded-server --server-arg --server-file 选项

    • mysqltest_embedded mysql_client_test_embedded 测试程序

  • mysql_plugin 移除工具。 替代方案包括使用 --plugin-load or --plugin-load-add 选项 在服务器启动时加载插件 ,或者在运行时使用 INSTALL PLUGIN 语句 加载插件

  • 的resolveip 工具被删除。 可以使用 nslookup host dig

  • resolve_stack_dump 工具被删除。 来自官方MySQL构建的堆栈跟踪始终是符号化的,因此不需要使用 resolve_stack_dump

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

    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 data_lock_waits 表。

    注意

    在MySQL 5.7中, LOCK_TABLE 在列 INNODB_LOCKS 表和 locked_table 在列 sys 模式 innodb_lock_waits x$innodb_lock_waits 视图包含组合模式/表名的值。 在MySQL 8.0中, data_locks 表和 sys 模式视图包含单独的模式名称和表名称列。 请参见 第27.4.3.9节“innodb_lock_waits和x $ innodb_lock_waits视图”

  • InnoDB 不再支持压缩的临时表。 innodb_strict_mode 启用(默认值), CREATE TEMPORARY TABLE 如果返回错误 ROW_FORMAT=COMPRESSED KEY_BLOCK_SIZE 指定的。 如果 innodb_strict_mode 禁用,则发出警告,并使用非压缩行格式创建临时表。

  • InnoDB 在MySQL数据目录之外创建表空间数据文件时, 不再创建 .isl 文件( InnoDB 符号链接文件)。 innodb_directories 选项现在支持查找在数据目录之外创建的表空间文件。

    通过此更改, .isl 不再支持 在服务器脱机时通过手动修改 文件来 移动远程表空间 innodb_directories 选项 现在支持移动远程表空间文件 请参见 第15.6.3.8节“在服务器脱机时移动表空间文件”

  • InnoDB 删除了 以下 文件格式变量:

    • innodb_file_format

    • innodb_file_format_check

    • innodb_file_format_max

    • innodb_large_prefix

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

    FILE_FORMAT 列已从 INNODB_TABLES INNODB_TABLESPACES 信息模式表中 删除

  • innodb_support_xa 系统变量,这使得能够对两相支持XA事务的提交,除去。 InnoDB 始终启用对XA事务中的两阶段提交的支持。

  • 删除了对DTrace的支持。

  • JSON_APPEND() 功能已被删除。 JSON_ARRAY_APPEND() 改用。

  • InnoDB MySQL 8.0.13中删除了 在共享 表空间中 放置表分区的支持 共享表空间包括 InnoDB 系统表空间和通用表空间。 有关识别共享表空间中的分区并将其移动到每个表文件表空间的信息,请参见 第2.11.5节“准备升级安装”

  • 支持 SET 在MySQL 8.0.13中不推荐使用的 语句中设置用户变量 此功能可能会在MySQL 9.0中删除。

  • --ndb PERROR 移除选项。 请改用 ndb_perror 实用程序。

  • innodb_undo_logs 变量已被删除。 innodb_rollback_segments 变量执行相同的功能,应该代替。

  • Innodb_available_undo_logs 取出状态变量。 可以使用检索每个表空间的可用回滚段的数量 SHOW VARIABLES LIKE 'innodb_rollback_segments';

  • 从MySQL 8.0.14开始,先前弃用的 innodb_undo_tablespaces 变量不再可配置。 有关更多信息,请参见 第15.6.3.4节“撤消表空间”

  • ALTER TABLE ... UPGRADE PARTITIONING 已取消 对该 声明的 支持

  • 从MySQL 8.0.16开始, internal_tmp_disk_storage_engine 已删除 系统变量的 支持 ; 磁盘上的内部临时表现在始终使用 InnoDB 存储引擎。 有关 详细信息, 请参阅 磁盘内部临时表的存储引擎

1.5 MySQL 8.0中添加,弃用或删除了服务器和状态变量和选项

本节列出了第一次添加,已弃用或已在MySQL 8.0中删除的服务器变量,状态变量和选项。

选项和变量在MySQL 8.0中引入

以下系统变量,状态变量和选项是MySQL 8.0中的新增功能,并未包含在任何先前的发行版系列中。

选项和变量在MySQL 8.0中不推荐使用

MySQL 8.0中不推荐使用以下系统变量,状态变量和选项。

  • expire_logs_days :在这么多天之后清除二进制日志。 从MySQL 8.0.3开始不推荐使用。

  • innodb_undo_tablespaces :回滚段之间划分的表空间文件数。 从MySQL 8.0.4开始不推荐使用。

  • log_syslog :是否将错误日志写入syslog。 从MySQL 8.0.2开始不推荐使用。

  • no-dd-upgrade :防止在启动时自动升级数据字典表。 自MySQL 8.0.16起不推荐使用。

  • symbolic-links :允许MyISAM表的符号链接。 从MySQL 8.0.2开始不推荐使用。

在MySQL 8.0中删除了选项和变量

MySQL 8.0中删除了以下系统变量,状态变量和选项。

  • Com_alter_db_upgrade :ALTER DATABASE计数...升级数据目录名称语句。 在MySQL 8.0.0中删除。

  • Innodb_available_undo_logs :显示InnoDB回滚段的总数; 与innodb_rollback_segments不同,后者显示活动回滚段的数量。 在MySQL 8.0.2中删除。

  • Qcache_free_blocks :查询缓存中的可用内存块数。 在MySQL 8.0.3中删除。

  • Qcache_free_memory :查询缓存的可用内存量。 在MySQL 8.0.3中删除。

  • Qcache_hits :查询缓存命中数。 在MySQL 8.0.3中删除。

  • Qcache_inserts :查询缓存插入的数量。 在MySQL 8.0.3中删除。

  • Qcache_lowmem_prunes :由于缓存中缺少可用内存而从查询缓存中删除的查询数。 在MySQL 8.0.3中删除。

  • Qcache_not_cached :非缓存查询的数量(由于query_cache_type设置,不可缓存或未缓存)。 在MySQL 8.0.3中删除。

  • Qcache_queries_in_cache :查询缓存中注册的查询数。 在MySQL 8.0.3中删除。

  • Qcache_total_blocks :查询缓存中的块总数。 在MySQL 8.0.3中删除。

  • Slave_heartbeat_period :从属的复制心跳间隔,以秒为单位。 在MySQL 8.0.1中删除。

  • Slave_last_heartbeat :以TIMESTAMP格式显示收到最新心跳信号的时间。 在MySQL 8.0.1中删除。

  • Slave_received_heartbeats :自上次重置以来复制从站接收的心跳数。 在MySQL 8.0.1中删除。

  • Slave_retried_transactions :自启动以来复制从属SQL线程已重试事务的总次数。 在MySQL 8.0.1中删除。

  • Slave_running :此服务器的状态为复制从属(从属I / O线程状态)。 在MySQL 8.0.1中删除。

  • bootstrap :由mysql安装脚本使用。 在MySQL 8.0.0中删除。

  • date_format :DATE格式(未使用)。 在MySQL 8.0.3中删除。

  • datetime_format :DATETIME / TIMESTAMP格式(未使用)。 在MySQL 8.0.3中删除。

  • des-key-file :从给定文件加载des_encrypt()和des_encrypt的密钥。 在MySQL 8.0.3中删除。

  • group_replication_allow_local_disjoint_gtids_join :允许当前服务器加入该组,即使该组中没有事务。 在MySQL 8.0.4中删除。

  • have_crypt :crypt()系统调用的可用性。 在MySQL 8.0.3中删除。

  • ignore-builtin-innodb :忽略内置的InnoDB。 在MySQL 8.0.3中删除。

  • ignore-db-dir :将目录视为非数据库目录。 在MySQL 8.0.0中删除。

  • ignore_db_dirs :目录被视为非数据库目录。 在MySQL 8.0.0中删除。

  • innodb_checksums :启用InnoDB校验和验证。 在MySQL 8.0.0中删除。

  • innodb_disable_resize_buffer_pool_debug :禁用InnoDB缓冲池的大小调整。 在MySQL 8.0.0中删除。

  • innodb_file_format :新InnoDB表的格式。 在MySQL 8.0.0中删除。

  • innodb_file_format_check :InnoDB是否执行文件格式兼容性检查。 在MySQL 8.0.0中删除。

  • innodb_file_format_max :共享表空间中的文件格式标记。 在MySQL 8.0.0中删除。

  • innodb_large_prefix :为列前缀索引启用更长的键。 在MySQL 8.0.0中删除。

  • innodb_locks_unsafe_for_binlog :强制InnoDB不使用下一键锁定。 而是仅使用行级锁定。 在MySQL 8.0.0中删除。

  • innodb_scan_directories :定义在InnoDB恢复期间扫描表空间文件的目录。 在MySQL 8.0.4中删除。

  • innodb_stats_sample_pages :要为索引分布统计信息进行采样的索引页数。 在MySQL 8.0.0中删除。

  • innodb_support_xa :为XA两阶段提交启用InnoDB支持。 在MySQL 8.0.0中删除。

  • innodb_undo_logs :定义InnoDB使用的撤消日志(回滚段)的数量; innodb_rollback_segments的别名。 在MySQL 8.0.2中删除。

  • internal_tmp_disk_storage_engine :内部临时表的存储引擎。 在MySQL 8.0.16中删除。

  • log-warnings :将一些非关键警告记录到日志文件中。 在MySQL 8.0.3中删除。

  • log_builtin_as_identified_by_password :是否以向后兼容的方式记录CREATE / ALTER USER,GRANT。 在MySQL 8.0.11中删除。

  • log_error_filter_rules :筛选错误日志记录的规则。 在MySQL 8.0.4中删除。

  • log_syslog :是否将错误日志写入syslog。 在MySQL 8.0.13中删除。

  • log_syslog_facility :系统日志消息的工具。 在MySQL 8.0.13中删除。

  • log_syslog_include_pid :是否在syslog消息中包含服务器PID。 在MySQL 8.0.13中删除。

  • log_syslog_tag :标记syslog消息中的服务器标识符。 在MySQL 8.0.13中删除。

  • max_tmp_tables : 没用过。 在MySQL 8.0.3中删除。

  • metadata_locks_cache_size :元数据的大小锁定缓存。 在MySQL 8.0.13中删除。

  • metadata_locks_hash_instances :元数据锁定哈希值的数量。 在MySQL 8.0.13中删除。

  • multi_range_count :范围选择期间一次发送到表处理程序的最大范围数。 在MySQL 8.0.3中删除。

  • old_passwords :为PASSWORD()选择密码哈希方法。 在MySQL 8.0.11中删除。

  • partition :启用(或禁用)分区支持。 在MySQL 8.0.0中删除。

  • query_cache_limit :不要缓存大于此的结果。 在MySQL 8.0.3中删除。

  • query_cache_min_res_unit :分配结果空间的最小单位大小(在写入所有结果数据后将修剪最后一个单位)。 在MySQL 8.0.3中删除。

  • query_cache_size :分配用于存储旧查询结果的内存。 在MySQL 8.0.3中删除。

  • query_cache_type :查询缓存类型。 在MySQL 8.0.3中删除。

  • query_cache_wlock_invalidate :在LOCK上查询缓存中的查询无效以进行写入。 在MySQL 8.0.3中删除。

  • secure-auth :禁止对具有旧(4.1之前)密码的帐户进行身份验证。 在MySQL 8.0.3中删除。

  • show_compatibility_56 :SHOW STATUS / VARIABLES的兼容性。 在MySQL 8.0.1中删除。

  • skip-partition :不要启用用户定义的分区。 在MySQL 8.0.0中删除。

  • sync_frm :在创建时将.frm同步到磁盘。 默认情况下启用。 在MySQL 8.0.0中删除。

  • temp-pool :使用此选项将导致创建的大多数临时文件使用一小组名称,而不是每个新文件的唯一名称。 在MySQL 8.0.1中删除。

  • time_format :TIME格式(未使用)。 在MySQL 8.0.3中删除。

  • tx_isolation :默认事务隔离级别。 在MySQL 8.0.3中删除。

  • tx_read_only :默认事务访问模式。 在MySQL 8.0.3中删除。

1.6 MySQL信息源

本节列出了您可能会发现有用的其他信息的来源,例如MySQL网站,邮件列表,用户论坛和Internet中继聊天。

1.6.1 MySQL网站

MySQL文档的主要网站是 https://dev.mysql.com/doc/ 在线和可下载的文档格式可用于MySQL参考手册,MySQL连接器等。

MySQL开发人员提供有关 MySQL服务器博客的 新功能和即将推出的功能的信息

1.6.2 MySQL邮件列表

本节介绍MySQL邮件列表,并提供有关如何使用列表的指南。 当您订阅邮件列表时,您会收到列表中的所有帖子作为电子邮件。 您也可以将自己的问题和答案发送到列表中。

要订阅或取消订阅本节中描述的任何邮件列表,请访问 http://lists.mysql.com/ 对于大多数用户,您可以选择获取单个邮件的列表的常规版本,或者每天收到一封大邮件的摘要版本。

不要 发送有关订阅或取消订阅任何邮件列表的消息,因为此类消息会自动分发给数千名其他用户。

您的本地站点可能有许多MySQL邮件列表的订阅者。 如果是这样,该站点可能具有本地邮件列表,以便从 lists.mysql.com 您的站点 发送的邮件 传播到本地列表。 在这种情况下,请与您的系统管理员联系,以添加到本地MySQL列表或从本地MySQL列表中删除。

要使邮件列表的流量转到邮件程序中的单独邮箱,请根据邮件头设置过滤器。 您可以使用 List-ID: Delivered-To: 标题来标识列表消息。

MySQL邮件列表如下:

  • announce

    新版MySQL及相关程序的公告列表。 这是一个所有MySQL用户都应订阅的低容量列表。

  • mysql

    一般MySQL讨论的主要列表。 请注意,在更专业的列表中更好地讨论了一些主题。 如果您发布到错误的列表,您可能无法得到答案。

  • bugs

    希望随时了解自上次发布MySQL以来所报告的问题或希望积极参与错误搜索和修复过程的人员列表。 请参见 第1.7节“如何报告错误或问题”

  • internals

    处理MySQL代码的人员列表。 这也是讨论MySQL开发和发布补丁的论坛。

  • mysqldoc

    处理MySQL文档的人员列表。

  • benchmarks

    任何对性能问题感兴趣的人的清单。 讨论主要集中在数据库性能(不仅限于MySQL)上,还包括更广泛的类别,如内核性能,文件系统,磁盘系统等。

  • packagers

    有关打包和分发MySQL的讨论列表。 这是分发维护者用来交换包装MySQL的想法以及确保MySQL在所有支持的平台和操作系统上看起来和感觉尽可能相似的论坛。

  • java

    有关MySQL服务器和Java的讨论列表。 它主要用于讨论JDBC驱动程序,如MySQL Connector / J.

  • win32

    有关Microsoft操作系统上MySQL软件的所有主题的列表,例如Windows 9x,Me,NT,2000,XP和2003。

  • myodbc

    有关使用ODBC连接MySQL服务器的所有主题的列表。

  • gui-tools

    有关MySQL图形用户界面工具(如MySQL Workbench)的所有主题的列表。

  • cluster

    讨论MySQL Cluster的列表。

  • dotnet

    讨论MySQL服务器和.NET平台的列表。 它主要与MySQL Connector / NET有关。

  • plusplus

    有关使用C ++ API for MySQL进行编程的所有主题的列表。

  • perl

    有关Perl支持MySQL的所有主题的列表 DBD::mysql

如果您无法从MySQL邮件列表或论坛中获得问题的答案,则可以选择从Oracle购买支持。 这使您直接与MySQL开发人员联系。

以下MySQL邮件列表使用英语以外的语言。 这些列表不由Oracle运营。

1.6.2.1使用邮件列表的准则

请勿在打开HTML模式的情况下从浏览器发布邮件。 许多用户不使用浏览器阅读邮件。

当您回答发送到邮件列表的问题时,如果您认为您的答案具有广泛的兴趣,您可能希望将其发布到列表中,而不是直接回复询问的个人。 尽量使你的答案足够普遍,原始海报以外的人可能会从中受益。 当您发布到列表时,请确保您的答案不是以前答案的重复。

尝试在回复中总结问题的基本部分。 不要觉得有必要引用整个原始信息。

当答案单独发送给您而不是邮件列表时,总结答案并将摘要发送到邮件列表被认为是礼仪,这样其他人可能会从您收到的回复中获益,帮助您解决问题。

1.6.3 MySQL论坛的MySQL社区支持

http://forums.mysql.com 上的 论坛 是一个重要的社区资源。 许多论坛都可用,分为以下常规类别:

  • 移民

  • MySQL用法

  • MySQL连接器

  • 编程语言

  • 工具

  • 第三方应用程序

  • 存储引擎

  • MySQL技术

  • SQL标准

  • 商业

1.6.4 Internet中继聊天(IRC)上的MySQL社区支持

除了各种MySQL邮件列表和论坛,您还可以在Internet Relay Chat(IRC)上找到经验丰富的社区人员。 这些是我们目前所知的最佳网络/频道:

freenode (请参阅 http://www.freenode.net/ 了解服务器)

  • #mysql 主要用于MySQL问题,但欢迎其他数据库和一般SQL问题。 关于PHP,Perl或C与MySQL结合的问题也很常见。

  • #workbench 主要针对MySQL Workbench相关的问题和想法,它也是一个满足MySQL Workbench开发人员的好地方。

1.6.5 MySQL企业版

Oracle以MySQL Enterprise的形式提供技术支持。 对于依赖MySQL DBMS进行业务关键型生产应用程序的组织,MySQL Enterprise是一种商业订阅产品,包括:

  • MySQL企业服务器

  • MySQL企业监控器

  • 每月快速更新和季度服务包

  • MySQL知识库

  • 全天候技术和咨询支持

MySQL Enterprise提供多层,使您可以灵活地选择最符合您需求的服务级别。 有关更多信息,请参阅 MySQL Enterprise

1.7如何报告错误或问题

在发布有关问题的错误报告之前,请尝试验证它是否存在错误,并且尚未报告错误:

  • 首先在 https://dev.mysql.com/doc/上 搜索MySQL在线手册 我们尝试通过解决新发现的问题来经常更新手册,以使手册保持最新。 此外,本手册附带的发行说明特别有用,因为新版本很可能包含解决您问题的方法。 发行说明可在手册中给出的位置获得。

  • 如果您收到SQL语句的解析错误,请仔细检查您的语法。 如果您找不到它的错误,您的当前版本的MySQL服务器很可能不支持您正在使用的语法。 如果您使用的是当前版本,并且本手册未涵盖您使用的语法,则MySQL Server不支持您的语句。

    如果手册涵盖了您正在使用的语法,但您使用的是旧版MySQL服务器,则应检查MySQL更改历史记录以查看语法的实现时间。 在这种情况下,您可以选择升级到较新版本的MySQL Server。

  • 有关常见问题的解决方案,请参见 第B.4节“问题和常见错误”

  • 搜索 http://bugs.mysql.com/ 的错误数据库, 查看是否已报告并修复了错误。

  • http://lists.mysql.com/上 搜索MySQL邮件列表存档 请参见 第1.6.2节“MySQL邮件列表”

  • 您还可以使用 http://www.mysql.com/search/ 搜索位于MySQL网站的所有网页(包括手册)。

如果您在手册,错误数据库或邮件列表存档中找不到答案,请咨询您当地的MySQL专家。 如果您仍无法找到问题的答案,请使用以下指南报告错误。

报告错误的常规方法是访问 http://bugs.mysql.com/ ,这是我们的错误数据库的地址。 该数据库是公开的,任何人都可以浏览和搜索。 如果您登录系统,则可以输入新报告。

发布说明中注明了 http://bugs.mysql.com/ 的错误数据库中 发布的针对给定版本进行了更正 的错误

如果您在MySQL服务器中发现敏感的安全漏洞,请立即通过发送电子邮件告知我们 例外:支持客户应在 http://support.oracle.com/上 向Oracle支持部门报告所有问题,包括安全漏洞

要讨论其他用户的问题,您可以使用其中一个MySQL邮件列表。 第1.6.2节“MySQL邮件列表”

编写一个好的错误报告需要耐心,但是第一次做正确的事情可以为我们和你自己节省时间。 一个好的错误报告,包含错误的完整测试用例,使我们很有可能在下一个版本中修复错误。 本节可以帮助您正确地编写报告,这样您就不会浪费时间做一些可能对我们没有多大帮助的事情。 请仔细阅读本节,并确保此处描述的所有信息都包含在您的报告中。

最好在发布之前使用最新的MySQL服务器生产版或开发版测试问题。 任何人都应该能够通过使用 mysql test < script_file 您的测试用例或运行您在错误报告中包含的shell或Perl脚本 来重复该错误 我们能够重复的任何错误很有可能在下一个MySQL版本中被修复。

当错误报告中包含对问题的良好描述时,它会非常有用。 也就是说,给出一个很好的例子,说明你所做的一切导致了问题,并详细描述了问题本身。 最好的报告包括一个完整的例子,显示如何重现错误或问题。 请参见 第29.5节“调试和移植MySQL”

请记住,我们可以回复包含太多信息的报告,但不能回复包含太少信息的报告。 人们经常忽略事实,因为他们认为他们知道问题的原因并假设某些细节无关紧要。 一个好的原则是,如果你对陈述某事有疑问,请说出来。 如果我们必须要求您提供初始报告中缺少的信息,那么在报告中写几行更快,更麻烦,而不是等待更长时间的答案。

错误报告中最常见的错误是(a)不包括您使用的MySQL发行版的版本号,以及(b)没有完全描述安装MySQL服务器的平台(包括平台类型和版本号) 。 这些是高度相关的信息,在100个中的99个案例中,如果没有它们,错误报告就毫无用处。 我们经常会遇到这样的问题: 为什么这对我不起作用? 然后我们发现请求的功能没有在MySQL版本中实现,或者报告中描述的错误已在较新的MySQL版本中得到修复。 错误通常与平台有关。 在这种情况下,我们几乎不可能在不知道操作系统和平台版本号的情况下修复任何问题。

如果您从源代码编译MySQL,请记住还提供有关编译器的信息,如果它与问题有关。 通常人们会在编译器中发现错误,并认为问题与MySQL有关。 大多数编译器一直在开发中,并且逐个版本变得更好。 要确定您的问题是否取决于您的编译器,我们需要知道您使用的编译器。 请注意,每个编译问题都应视为错误并进行相应报告。

如果程序产生错误消息,则在报告中包含该消息非常重要。 如果我们尝试从档案中搜索某些内容,则报告的错误消息最好与程序生成的错误消息匹配。 (甚至应该遵守字母。)最好将整个错误消息复制并粘贴到报告中。 您永远不应该尝试从内存中重现该消息。

如果您遇到Connector / ODBC(MyODBC)问题,请尝试生成跟踪文件并将其与报告一起发送。 请参见 如何报告连接器/ ODBC问题或错误

如果您的报告包含使用 mysql 命令行工具 运行的测试用例的长查询输出行 ,则可以使用 --vertical 选项或 \G 语句终止符 使输出更具可读性 EXPLAIN SELECT 本节后面 示例演示了如何使用 \G

请在报告中包含以下信息:

  • 您正在使用的MySQL发行版的版本号(例如,MySQL 5.7.10)。 您可以通过执行 mysqladmin版本 找到您正在运行的 版本 中mysqladmin 程序可以在找到 bin 你的MySQL安装目录下的目录。

  • 您遇到问题的机器的制造商和型号。

  • 操作系统名称和版本。 如果您使用Windows,通常可以通过双击“我的电脑”图标并下拉 帮助/关于Windows 菜单 来获取名称和版本号 对于大多数类Unix操作系统,您可以通过执行命令获取此信息 uname -a

  • 有时内存量(真实和虚拟)是相关的。 如有疑问,请包含这些值。

  • docs/INFO_BIN MySQL安装文件 的内容 此文件包含有关如何配置和编译MySQL的信息。

  • 如果您使用的是MySQL软件的源代码分发,请包含您使用的编译器的名称和版本号。 如果您有二进制分发,请包含分发名称。

  • 如果在编译期间出现问题,请在发生错误的文件中包含确切的错误消息以及围绕违规代码的几行上下文。

  • 如果 mysqld 死了,你还应该报告崩溃 mysqld 的声明 您通常可以通过在 启用查询日志记录的 情况下运行 mysqld 来获取此信息 ,然后在 mysqld 崩溃 后查看日志 请参见 第29.5节“调试和移植MySQL”

  • 如果数据库表与问题相关,请 在错误报告中 包含 语句 的输出 这是获取数据库中任何表的定义的一种非常简单的方法。 这些信息有助于我们创建与您所经历的情境相匹配的情境。 SHOW CREATE TABLE db_name.tbl_name

  • 发生问题时生效的SQL模式可能很重要,因此请报告 sql_mode 系统变量 的值 对于存储过程,存储函数和触发器对象,相关 sql_mode 值是创建对象时有效的值。 对于存储过程或函数, SHOW CREATE PROCEDURE or SHOW CREATE FUNCTION 语句显示相关的SQL模式,或者您可以查询 INFORMATION_SCHEMA 信息:

    SELECT ROUTINE_SCHEMA,ROUTINE_NAME,SQL_MODE
    FROM INFORMATION_SCHEMA.ROUTINES;
    

    对于触发器,您可以使用以下语句:

    SELECT EVENT_OBJECT_SCHEMA,EVENT_OBJECT_TABLE,TRIGGER_NAME,SQL_MODE
    FROM INFORMATION_SCHEMA.TRIGGERS;
    
  • 对于与性能相关的错误或 SELECT 语句 问题 ,应始终包括语句的输出 EXPLAIN SELECT ... ,以及至少包含该 SELECT 语句生成 的行数 您还应该包含所 涉及的每个表 的输出 您提供的有关您的情况的信息越多,有人可以帮助您的可能性就越大。 SHOW CREATE TABLE tbl_name

    以下是一个非常好的错误报告的示例。 使用 mysql 命令行工具 运行语句 请注意 \G 语句终止符用于语句,否则这些语句将提供难以阅读的非常长的输出行。

    mysql> SHOW VARIABLES;
    mysql> 
    mysql> 
    mysql> 
    mysql> 
    mysql>SHOW COLUMNS FROM ...\G
           <output from SHOW COLUMNS>EXPLAIN SELECT ...\G
           <output from EXPLAIN>FLUSH STATUS;SELECT ...;
           <A short version of the output from SELECT,
           including the time taken to run the query>SHOW STATUS;
           <output from SHOW STATUS>
    
  • 如果在运行 mysqld 时出现错误或问题 ,请尝试提供重现异常的输入脚本。 此脚本应包含任何必需的源文件。 脚本越能重现您的情况越好。 如果您可以制作可重现的测试用例,则应将其上载以附加到错误报告中。

    如果您无法提供脚本,则至少应在报告中包含 mysqladmin variables extended-status processlist 的输出, 以提供有关系统性能的一些信息。

  • 如果您不能生成只有几行的测试用例,或者测试表太大而无法包含在错误报告中(超过10行),则应使用 mysqldump 转储表 并创建 README 描述问题 文件。 使用 tar gzip zip 创建文件的压缩存档 http://bugs.mysql.com/上 为我们的错误数据库启动错误报告后 ,单击错误报告中的“文件”选项卡,获取有关将存档上载到错误数据库的说明。

  • 如果您认为MySQL服务器从语句中产生奇怪的结果,不仅包括结果,还包括您对结果应该是什么的看法,以及描述您的意见基础的解释。

  • 当您提供问题的示例时,最好使用实际情况中存在的表名,变量名等,而不是提出新名称。 问题可能与表或变量的名称有关。 这些情况很少见,但是安全比抱歉更好。 毕竟,你应该更容易提供一个使用你的实际情况的例子,这对我们来说更好。 如果您有错误报告中不希望其他人看到的数据,您可以使用“文件”选项卡上传它,如前所述。 如果这些信息真的是绝密的,你甚至不想向我们展示,请继续使用其他名称提供一个例子,

  • 如果可能,包括给予相关计划的所有选项。 例如,指出启动 mysqld 服务器 时使用的选项, 以及用于运行任何MySQL客户端程序的选项。 mysqld mysql 等程序的选项 ,以及 configure 脚本,通常是解决问题的关键,非常重要。 包含它们绝不是一个坏主意。 如果您的问题涉及用Perl或PHP等语言编写的程序,请包括语言处理器的版本号,以及程序使用的任何模块的版本。 例如,如果您有一个使用 DBI DBD::mysql 模块 的Perl脚本 ,请包含Perl的版本号 DBI ,和 DBD::mysql

  • 如果您的问题与权限系统有关,请包括 mysqladmin reload 的输出 以及尝试连接时获得的所有错误消息。 当您测试权限时,您应该执行 mysqladmin reload version 并尝试连接给您带来麻烦的程序。

  • 如果你有一个bug补丁,请包含它。 但是,如果您没有提供一些必要的信息,例如显示修补程序修复的错误的测试用例,请不要认为补丁是我们所需要的,或者我们可以使用它。 我们可能会发现您的补丁有问题,或者我们可能根本不理解它。 如果是这样,我们就不能使用它。

    如果我们无法验证补丁的确切用途,我们将不会使用它。 测试用例可以帮助我们。 显示修补程序处理可能发生的所有情况。 如果我们发现一个边界情况(甚至是一个罕见的情况)补丁将无法工作,它可能是无用的。

  • 猜测错误是什么,它发生的原因或它依赖的通常是错误的。 即使MySQL团队在没有首先使用调试器来确定错误的真正原因的情况下也无法猜测这些事情。

  • 在您的错误报告中指出您已检查参考手册和邮件存档,以便其他人知道您已尝试自己解决问题。

  • 如果您的数据显示已损坏或在访问特定表时出现错误,请首先检查您的表 CHECK TABLE 如果该语句报告任何错误:

    • InnoDB 故障恢复机制处理清理服务器时被杀害后重新开始,所以在典型的操作没有必要 修复 表。 如果遇到 InnoDB 错误 ,请重新启动服务器并查看问题是否仍然存在,或者错误是否仅影响内存中的缓存数据。 如果磁盘上的数据已损坏,请考虑在 innodb_force_recovery 启用 选项的情况下 重新启动, 以便您可以转储受影响的表。

    • 对于非事务性表,请尝试 REPAIR TABLE 使用 myisamchk 或使用 myisamchk 进行修复 请参见 第5章, MySQL服务器管理

    如果您运行的是Windows,请验证 lower_case_table_names 使用该 SHOW VARIABLES LIKE 'lower_case_table_names' 语句 的值 此变量影响服务器处理数据库和表名称的字母大写的方式。 它对给定值的影响应如 第9.2.2节“标识符区分大小写”中所述

  • 如果您经常遇到损坏的表,您应该尝试找出这种情况发生的时间和原因。 在这种情况下,MySQL数据目录中的错误日志可能包含有关发生的事情的一些信息。 (这是 .err 名称中 带有 后缀 的文件 。)请参见 第5.4.2节“错误日志” 请在错误报告中包含此文件中的所有相关信息。 通常情况下 的mysqld 应该 从来没有 崩溃的表,如果没有在更新过程中把它打死了。 如果你能找到 mysqld 死亡 的原因, 我们就可以更容易地为你解决这个问题。 看到 第B.4.1节“如何确定导致问题的原因”

  • 如果可能,请下载并安装最新版本的MySQL Server,并检查它是否能解决您的问题。 所有版本的MySQL软件都经过全面测试,应该可以正常运行。 我们相信尽可能地使所有内容都向后兼容,并且您应该能够毫无困难地切换MySQL版本。 请参见 第2.1.1节“要安装的MySQL版本和分发版本”

1.8 MySQL标准合规性

本节描述MySQL如何与ANSI / ISO SQL标准相关。 MySQL Server有许多SQL标准的扩展,在这里你可以找到它们是什么以及如何使用它们。 您还可以找到有关MySQL Server缺少的功能的信息,以及如何解决一些差异。

SQL标准自1986年以来一直在发展,并且存在多个版本。 在本手册中, SQL-92 是指1992年发布的标准。 SQL:1999 SQL:2003 SQL:2008 SQL:2011 是指发布的标准版本相应的年份,最后一个版本是最新版本。 我们使用短语 SQL标准 标准SQL 在任何时候表示当前版本的SQL标准。

我们对该产品的主要目标之一是继续努力遵守SQL标准,但不会牺牲速度或可靠性。 我们不怕添加SQL扩展或支持非SQL功能,如果这大大增加了MySQL服务器对我们用户群的大部分可用性。 HANDLER 接口是这一战略的一个例子。 请参见 第13.2.4节“HANDLER语法”

我们继续支持事务性和非事务性数据库,以满足关键任务24/7使用和繁重的Web或日志记录使用。

MySQL Server最初设计用于在小型计算机系统上使用中型数据库(1000万-100万行,或每个表约100MB)。 今天MySQL服务器处理TB级数据库。

虽然MySQL复制功能提供了重要的功能,但我们并未针对实时支持。

MySQL支持ODBC级别0到3.51。

MySQL支持使用 NDBCLUSTER 存储引擎进行 高可用性数据库集群 请参见 第22章, MySQL NDB Cluster 8.0

我们实现支持大多数W3C XPath标准的XML功能。 请参见 第12.11节“XML函数”

MySQL支持RFC 7159定义的原生JSON数据类型,并基于ECMAScript标准(ECMA-262)。 请参见 第11.6节“JSON数据类型” MySQL还实现了SQL:2016标准的预发布草案所指定的SQL / JSON函数的子集; 有关更多信息 请参见 第12.17节“JSON函数”

选择SQL模式

MySQL服务器可以在不同的SQL模式下运行,并且可以针对不同的客户端以不同的方式应用这些模式,具体取决于 sql_mode 系统变量 的值 DBA可以设置全局SQL模式以匹配站点服务器操作要求,并且每个应用程序可以将其会话SQL模式设置为其自己的要求。

模式会影响MySQL支持的SQL语法以及它执行的数据验证检查。 这使得在不同环境中使用MySQL以及将MySQL与其他数据库服务器一起使用变得更加容易。

有关设置SQL模式的更多信息,请参见 第5.1.11节“服务器SQL模式”

在ANSI模式下运行MySQL

要在ANSI模式下运行MySQL Server,请 使用该 选项 启动 mysqld --ansi 以ANSI模式运行服务器与使用以下选项启动服务器相同:

--transaction-isolation = SERIALIZABLE --sql-mode = ANSI

要在运行时实现相同的效果,请执行以下两个语句:

设定全球交易隔离级别可串行化;
SET GLOBAL sql_mode ='ANSI';

您可以看到设置 sql_mode 系统变量以 'ANSI' 启用与ANSI模式相关的所有SQL模式选项,如下所示:

mysql> SET GLOBAL sql_mode='ANSI';
mysql>SELECT @@GLOBAL.sql_mode;
        - >'REAL_AS_FLOAT,PIPES_AS_CONCAT,ANSI_QUOTES,IGNORE_SPACE,ANSI'

以ANSI模式运行服务器与 --ansi 设置SQL模式不完全相同, 'ANSI' 因为该 --ansi 选项还设置了事务隔离级别。

请参见 第5.1.7节“服务器命令选项”

1.8.1标准SQL的MySQL扩展

MySQL Server支持一些您可能在其他SQL DBMS中找不到的扩展。 请注意,如果您使用它们,您的代码将无法移植到其他SQL服务器。 在某些情况下,您可以使用以下格式的注释编写包含MySQL扩展的代码,但仍可移植。

/ *!MySQL-specific code* /

在这种情况下,MySQL Server会像在任何其他SQL语句中那样解析和执行注释中的代码,但其他SQL服务器将忽略这些扩展。 例如,MySQL Server STRAIGHT_JOIN 在以下语句中 识别 关键字,但其他服务器不会:

选择 /*!STRAIGHT_JOIN * / col1 FROM table1,table2 WHERE ...

如果在 ! 字符 后添加版本号 ,则仅当MySQL版本大于或等于指定的版本号时,才会执行注释中的语法。 KEY_BLOCK_SIZE 以下注释中 子句仅由MySQL 5.1.10或更高版本的服务器执行:

CREATE TABLE t1(INT,KEY(a))/ *!50110 KEY_BLOCK_SIZE = 1024 * /;

以下描述列出了按类别组织的MySQL扩展。

1.8.2 MySQL与标准SQL的区别

我们尝试使MySQL Server遵循ANSI SQL标准和ODBC SQL标准,但MySQL Server在某些情况下执行不同的操作:

1.8.2.1选择表格差异

MySQL Server不支持 SELECT ... INTO TABLE Sybase SQL扩展。 相反,MySQL Server支持 INSERT INTO ... SELECT 标准的SQL语法,这基本上是相同的。 请参见 第13.2.6.1节“INSERT ... SELECT语法” 例如:

INSERT INTO tbl_temp2(fld_id)
    SELECT tbl_temp1.fld_order_id
    FROM tbl_temp1 WHERE tbl_temp1.fld_order_id> 100;

或者,您可以使用 SELECT ... INTO OUTFILE CREATE TABLE ... SELECT

您可以使用 SELECT ... INTO 用户定义的变量。 使用游标和局部变量也可以在存储的例程中使用相同的语法。 请参见 第13.2.10.1节“SELECT ... INTO语法”

1.8.2.2更新差异

如果从表中访问要在表达式中更新 UPDATE 的列 ,请 使用列的当前值。 以下语句中的第二个赋值设置 col2 为当前(更新的) col1 值,而不是原始 col1 值。 结果就是 col1 并且 col2 具有相同的值。 此行为与标准SQL不同。

UPDATE t1 SET col1 = col1 + 1,col2 = col1;

1.8.2.3外键差异

外键的MySQL实现在以下关键方面与SQL标准不同:

  • 如果父表中有多个行具有相同的引用键值,则 InnoDB 在外键检查中执行操作,就好像其他具有相同键值的父行不存在一样。 例如,如果已定义 RESTRICT 类型约束,并且存在具有多个父行的子行, InnoDB 则不允许删除任何这些父行。

    InnoDB 基于对应于外键约束的索引中的记录,通过深度优先算法执行级联操作。

  • 一个 FOREIGN KEY 引用了非约束 UNIQUE 关键不是标准的SQL,而是一个 InnoDB 扩展。

  • 如果 ON UPDATE CASCADE 或者 ON UPDATE SET NULL recurses更新 它在同一级联中之前更新过的同 一个表 ,它就像是一样 RESTRICT 这意味着您不能使用自引用 ON UPDATE CASCADE ON UPDATE SET NULL 操作。 这是为了防止级联更新导致的无限循环。 自引用的 ON DELETE SET NULL ,在另一方面,是可能的,因为是自引用 ON DELETE CASCADE 级联操作可能不会嵌套超过15级。

  • 在插入,删除或更新许多行的SQL语句中,逐行检查外键约束(如唯一约束)。 执行外键检查时, InnoDB 在必须检查的子记录或父记录上设置共享行级锁。 MySQL立即检查外键约束; 检查不会延迟到事务提交。 根据SQL标准,默认行为应该是延迟检查。 也就是说,只有在处理 完整个SQL语句 后才会检查约束 这意味着无法使用外键删除引用自身的行。

有关 InnoDB 存储引擎 如何 处理外键的信息,请参见 第15.6.1.5节“InnoDB和FOREIGN KEY约束”

1.8.2.4' - '作为评论的开头

标准SQL使用C语法 /* this is a comment */ 进行注释,MySQL Server也支持此语法。 MySQL还支持对此语法的扩展,使特定于MySQL的SQL能够嵌入到注释中,如 第9.6节“注释语法”中所述

标准SQL使用 -- 作为开始注释序列。 MySQL Server # 用作开始注释字符。 MySQL Server还支持 -- 注释样式 的变体 也就是说, -- 开始 - 注释序列必须后跟空格(或者通过控制字符,例如换行符)。 该空间是必需的,以防止使用如下结构的自动生成的SQL查询出现问题,我们会自动插入付款值 payment

更新帐户SET credit = credit-payment

考虑如果 payment 具有负值 会发生什么, 例如 -1

更新帐户SET credit = credit  -  1

credit--1 是SQL中的有效表达式,但 -- 被解释为注释的开头,表达式的一部分被丢弃。 结果是一个与预期完全不同的语句:

更新帐户SET credit = credit

该声明根本不会产生任何价值变化。 这说明允许评论开始 -- 会产生严重后果。

使用我们的实现需要一个空格, -- 以便将它识别为MySQL服务器中的开始注释序列。 因此, credit--1 使用安全。

另一个安全功能是 mysql 命令行客户端忽略以 -- 开头的行

1.8.3 MySQL如何处理约束

MySQL使您既可以使用允许回滚的事务表,也可以使用不允许回滚的非事务表。 因此,MySQL中的约束处理与其他DBMS略有不同。 当您在非事务表中插入或更新了大量行时,我们必须处理这种情况,当发生错误时无法回滚更改。

基本原理是MySQL服务器在解析要执行的语句时尝试为它可以检测到的任何内容生成错误,并尝试从执行语句时发生的任何错误中恢复。 我们在大多数情况下这样做,但尚不是全部。

发生错误时MySQL所具有的选项是在中间停止语句或尽可能地从问题中恢复并继续。 默认情况下,服务器遵循后一个过程。 这意味着,例如,服务器可能将无效值强制转换为最接近的有效值。

有几种SQL模式选项可用于更好地控制错误数据值的处理以及是否继续执行语句或在发生错误时中止。 使用这些选项,您可以将MySQL服务器配置为以更传统的方式运行,就像拒绝不正确输入的其他DBMS一样。 可以在服务器启动时全局设置SQL模式以影响所有客户端。 各个客户端可以在运行时设置SQL模式,这使每个客户端都可以选择最适合其要求的行为。 请参见 第5.1.11节“服务器SQL模式”

以下部分描述了MySQL Server如何处理不同类型的约束。

1.8.3.1 PRIMARY KEY和UNIQUE索引约束

通常,数据更改语句(例如 INSERT UPDATE )会 发生错误,这些语句 会违反主键,唯一键或外键约束。 如果您使用的是事务性存储引擎 InnoDB ,则MySQL会自动回滚该语句。 如果您使用的是非事务性存储引擎,则MySQL会停止处理发生错误的行的语句,并使任何剩余的行保持未处理状态。

MySQL支持的 IGNORE 关键字 INSERT UPDATE 等。 如果您使用它,MySQL会忽略主键或唯一键违规,并继续处理下一行。 请参阅您正在使用的语句部分( 第13.2.6节“INSERT语法” 第13.2.12节“UPDATE语法” 等)。

您可以获取有关使用 mysql_info() C API函数 实际插入或更新的行数的信息 您也可以使用该 SHOW WARNINGS 声明。 请参见 第28.7.7.36节“mysql_info()” 第13.7.6.40节“显示警告语法”

InnoDB NDB 表支持外键。 请参见 第1.8.3.2节“外键约束”

1.8.3.2外键约束

外键允许您跨表交叉引用相关数据, 外键约束 有助于保持这种展开数据的一致性。

MySQL支持 ON UPDATE ON DELETE 外键的引用 CREATE TABLE ALTER TABLE 声明。 可用参照动作 RESTRICT (默认), , CASCADE SET NULL NO ACTION

SET DEFAULT MySQL服务器也支持,但目前被拒绝为无效 InnoDB 由于MySQL不支持延迟约束检查, NO ACTION 因此被视为 RESTRICT 有关MySQL支持外键的确切语法,请参见 第13.1.20.6节“使用FOREIGN KEY约束”

MATCH FULL MATCH PARTIAL MATCH SIMPLE 被允许,但应避免使用它们,因为它们会导致MySQL服务器忽略 同一语句中使用的 任何 ON DELETE ON UPDATE 子句。 MATCH 选项在MySQL中没有任何其他效果,这实际上强制执行 MATCH SIMPLE 语义全职。

MySQL要求将外键列编入索引; 如果您创建一个具有外键约束但在给定列上没有索引的表,则会创建一个索引。

您可以从 INFORMATION_SCHEMA.KEY_COLUMN_USAGE 表中 获取有关外键的信息 此处显示了针对此表的查询示例:

MySQL的> SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, CONSTRAINT_NAME
     > FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE
     >WHERE REFERENCED_TABLE_SCHEMA IS NOT NULL;
+ -------------- + --------------- + ------------- + ---- ------------- +
| TABLE_SCHEMA | TABLE_NAME | COLUMN_NAME | CONSTRAINT_NAME |
+ -------------- + --------------- + ------------- + ---- ------------- +
| fk1 | myuser | myuser_id | f |
| fk1 | product_order | customer_id | f2 |
| fk1 | product_order | product_id | f1 |
+ -------------- + --------------- + ------------- + ---- ------------- +
3行(0.01秒)

有关 InnoDB 上外键的信息 也可以 数据库 中的 INNODB_FOREIGN INNODB_FOREIGN_COLS 表中 找到 INFORMATION_SCHEMA

InnoDB NDB 表支持外键。 有关 外键支持的信息 请参见 第15.6.1.5节“InnoDB和FOREIGN KEY约束” InnoDB

1.8.3.3对无效数据的约束

默认情况下,MySQL可以容忍无效或不正确的数据值,并将它们强制为有效的数据输入值。 但是,您可以启用严格SQL模式以选择更糟糕的错误值的传统处理,以便服务器拒绝它们并中止它们出现的语句。 请参见 第5.1.11节“服务器SQL模式”

本节介绍MySQL的默认(宽容)行为,以及严格的SQL模式及其区别。

如果您没有使用严格模式,那么无论何时 向列中 插入 不正确 值,例如 NULL NOT NULL 插入到 列中或将过大的数值插入数字列,MySQL都会将列设置为 最佳可能值 而不是产生错误:以下规则更详细地描述了它的工作原理:

  • 如果您尝试将超出范围的值存储到数字列中,则MySQL Server会存储零,最小可能值或最大可能值,以最接近无效值为准。

  • 对于字符串,MySQL存储空字符串或尽可能多的存储在列中的字符串。

  • 如果您尝试将不以数字开头的字符串存储到数字列中,MySQL Server将存储0。

  • 第1.8.3.4节“ENUM和SET约束”中 所述,处理 ENUM SET 列的 值无效

  • MySQL的允许你存储某些不正确的日期值插入 DATE DATETIME 列(如 '2000-02-31' '2000-02-00' )。 在这种情况下,当应用程序未启用严格的SQL模式时,应用程序将在存储它们之前验证日期。 如果MySQL可以存储日期值并检索完全相同的值,MySQL会将其存储为给定值。 如果日期完全错误(服务器存储它的能力之外),则特殊的 日期值 '0000-00-00' 将存储在列中。

  • 如果尝试存储 NULL 到不带 NULL 的列,则 单行 INSERT 语句 会发生错误 对于多行 INSERT 语句或 INSERT INTO ... SELECT 语句,MySQL Server存储列数据类型的隐式默认值。 通常,这适用 0 于数字类型,字符串类型为空字符串( '' ,日期和时间类型为 值。 第11.7节“数据类型默认值” 中讨论了隐式默认值

  • 如果 INSERT 语句没有为列指定值,则在列定义包含explicit DEFAULT 子句时 ,MySQL会插入其默认值 如果定义没有这样的 DEFAULT 子句,MySQL会为列数据类型插入隐式默认值。

在非严格模式下使用前面的规则的原因是我们无法在语句开始执行之前检查这些条件。 如果我们在更新几行后遇到问题,我们不能回滚,因为存储引擎可能不支持回滚。 终止声明的选择并不是那么好; 在这种情况下,更新将 完成一半 ,这可能是最糟糕的情况。 在这种情况下,最好 尽你所能 ,然后继续,好像什么也没发生。

您可以使用 STRICT_TRANS_TABLES STRICT_ALL_TABLES SQL模式 选择更严格的输入值处理

SET sql_mode ='STRICT_TRANS_TABLES';
SET sql_mode ='STRICT_ALL_TABLES';

STRICT_TRANS_TABLES 为事务存储引擎启用严格模式,在某种程度上启用非事务性引擎。 它的工作原理如下:

  • 对于事务存储引擎,语句中任何位置出现的错误数据值都会导致语句中止和回滚。

  • 对于非事务性存储引擎,如果要插入或更新的第一行中发生错误,则语句将中止。 (当第一行发生错误时,语句可以被中止以保持表不变,就像事务表一样。)第一行之后的行中的错误不会中止语句,因为表已经被更改了第一排。 相反,调整错误的数据值并导致警告而不是错误。 换句话说,用 STRICT_TRANS_TABLES ,如果可以在不更改表的情况下完成,则错误的值会导致MySQL回滚到目前为止所做的所有更新。 但是一旦表格被更改,进一步的错误会导致调整和警告。

要进行更严格的检查,请启用 STRICT_ALL_TABLES 这与 STRICT_TRANS_TABLES 除了非事务性存储引擎之外 的情况相同, 即使对于第一行之后的行中的错误数据,错误也会中止该语句。 这意味着如果在非事务表的多行插入或更新中途发生错误,则会产生部分更新。 插入或更新较早的行,但是从错误点开始的行不是。 要避免非事务性表的这种情况,请使用单行语句或使用 STRICT_TRANS_TABLES 如果转换警告而不是错误是可以接受的。 为了避免问题,请不要使用MySQL来检查列内容。 让应用程序确保它只将有效值传递给数据库是最安全的(并且通常更快)。

无论使用哪种严格的模式选项,您可以通过使用引起的警告被视为错误 INSERT IGNORE 或者 UPDATE IGNORE ,而不是 INSERT UPDATE IGNORE

1.8.3.4 ENUM和SET约束

ENUM SET 列提供了一种有效的方法来定义只能包含给定值集的列。 请参见 第11.4.4节“ENUM类型” 第11.4.5节“SE​​T类型”

启用严格模式后(请参见 第5.1.11节“服务器SQL模式” ), ENUM SET 的定义将 作为输入到列中的值的约束。 对于不满足以下条件的值,会发生错误:

  • ENUM 值必须是列定义中列出 值之一,或其内部数值等效值。 该值不能是错误值(即0或空字符串)。 对于定义为一列 ENUM('a','b','c') ,值,如 '' 'd' 或者 'ax' 是无效的,并且将被拒绝。

  • SET 值必须是空字符串或由仅在由逗号分隔的列定义中列出的值的值。 对于定义为的列 SET('a','b','c') ,诸如 'd' 'a,b,c,d' 无效的 将被拒绝。

如果使用 INSERT IGNORE 或, 则可以在严格模式下禁止无效值的错误 UPDATE IGNORE 在这种情况下,会生成警告而不是错误。 对于 ENUM ,该值将作为错误成员( 0 插入 对于 SET ,除非删除任何无效的子字符串,否则将以给定的值插入值。 例如, 'a,x,b,y' 结果值为 'a,b'

1.9学分

以下部分列出了有助于使MySQL成为现实的开发人员,贡献者和支持者。

1.9.1 MySQL的贡献者

虽然Oracle公司和/或其附属公司拥有的所有版权 MySQL server MySQL manual ,我们希望认可那些谁作出这样或那样的贡献 MySQL distribution 此处列出了贡献者,有点随机顺序:

  • Gianmassimo Vigazzola

    Win32 / NT的初始端口。

  • 每个Eric Olsson

    对于动态记录格式的建设性批评和实际测试。

  • Irena Pancirov

    使用Borland编译器的Win32端口。 mysqlshutdown.exe mysqlwatch.exe

  • 大卫J.休斯

    为了努力制作共享软件SQL数据库。 在TcX,MySQL AB的前身,我们开始 mSQL ,但发现它无法满足我们的目的,所以我们为我们的应用程序构建器Unireg编写了一个SQL接口。 mysqladmin mysql 客户端是很大程度上受其 mSQL 对手 影响的程序 我们花了很多精力使MySQL语法成为超集 mSQL 许多API的想法都借 mSQL 用于将免费 mSQL 程序 移植 到MySQL API中。 MySQL软件不包含任何代码 mSQL 分发中的两个文件( client/insert_test.c client/select_test.c )基于发行版中相应的(非受版权保护的)文件 mSQL ,但作为示例进行修改,显示将代码转换 mSQL 为MySQL服务器 所需的更改 mSQL 受版权保护的David J. Hughes。)

  • 帕特里克林奇

    帮助我们获得 http://www.mysql.com/

  • 弗雷德林德伯格

    用于设置qmail来处理MySQL邮件列表以及我们在管理MySQL邮件列表时获得的难以置信的帮助。

  • 伊戈尔罗曼连科

    mysqldump (以前 msqldump ,但由Monty移植和增强)。

  • 尤里达里奥

    用于保持和扩展MySQL OS / 2端口。

  • 蒂姆·邦斯

    mysqlhotcopy的 作者

  • Zarko Mocnik

    排序斯洛文尼亚语。

  • “TAMITO”

    _MB 字符集宏以及UJIS和sjis字符集。

  • 约书亚查马斯

    基于并发插入,扩展日期语法,在NT上调试以及在MySQL邮件列表上回答。

  • 伊夫卡里尔

    mysqlaccess ,一个显示用户访问权限的程序。

  • Rhys Jones (和GWE科技有限公司)

    对于早期的JDBC驱动程序之一。

  • Xiaokun Kelvin朱博士

    进一步开发早期JDBC驱动程序之一和其他与MySQL相关的Java工具。

  • 詹姆斯库珀

    用于在其站点上设置可搜索的邮件列表存档。

  • 里克梅哈利克

    对于 xmysql MySQL服务器的图形X客户端。

  • Doug Sisk

    为Red Hat Linux提供MySQL的RPM包。

  • 迪曼亚历山大五世

    为Red Hat Linux-Alpha提供MySQL的RPM包。

  • Antoni Pamies Olive

    为英特尔和SPARC提供大量MySQL客户端的RPM版本。

  • Jay Bloodworth

    用于为MySQL 3.21提供RPM版本。

  • 大卫Sacerdote

    安全检查DNS主机名的想法。

  • 陈伟

    一些支持中文(BIG5)字符。

  • 魏鹤

    中文(GBK)字符集的许多功能。

  • Jan Pazdziora

    捷克排序。

  • Zeev Suraski

    FROM_UNIXTIME() 时间格式, ENCRYPT() 功能和 野牛 顾问。 活跃的邮件列表成员。

  • Luuk de Boer

    将基准套件移植(和扩展)到 DBI / DBD crash-me 基准测试 有很好的帮助 和运行。 一些新的日期功能。 mysql_setpermission 脚本。

  • 亚历克西斯米哈伊洛夫

    用户定义的函数(UDF); CREATE FUNCTION DROP FUNCTION

  • Andreas F. Bobak

    AGGREGATE 用户定义函数 扩展。

  • 罗斯威克林

    帮助设置InstallShield for MySQL-Win32。

  • Jethro Wright III

    libmysql.dll 库。

  • James Pereria

    Mysqlmanager,一个用于管理MySQL服务器的Win32 GUI工具。

  • 柯特桑普森

    将MIT-pthreads移植到NetBSD / Alpha和NetBSD 1.3 / i386。

  • 马丁拉姆施

    MySQL教程中的示例。

  • 史蒂夫哈维

    使 mysqlaccess 更安全。

  • Konark IA-64持久系统私人有限公司中心

    帮助MySQL服务器的Win64端口。

  • Albert Chin-A-Young。

    配置Tru64的更新,大文件支持和更好的TCP包装支持。

  • 约翰比尔尔

    pthread_mutex() OS / 2的 仿真

  • 本杰明普夫格曼

    MERGE 要处理的 扩展 INSERTS MySQL邮件列表中的活动成员。

  • Jocelyn Fournier

    优秀的发现和报告无数的错误(特别是在MySQL 4.1子查询代码中)。

  • Marc Liyanage

    维护OS X软件包并提供有关如何创建OS X软件包的宝贵反馈。

  • 罗伯特卢瑟福

    提供有关QNX端口的宝贵信息和反馈。

  • 以前的NDB Cluster开发人员

    很多人都参与了各种方式的暑期学生,硕士论文的学生,员工。 总共超过100人,所以这里太多了。 值得注意的名字是Ataullah Dabaghi,他直到1999年贡献了大约三分之一的代码库。 特别感谢AX系统的开发人员,他们为NDB Cluster提供了许多具有块,信号和崩溃跟踪功能的架构基础。 同样应该信任那些相信这些想法足以将其预算分配给1992年至今的发展的人。

  • 谷歌公司

    我们希望认可Google Inc.对MySQL发行版的贡献:Mark Callaghan的SMP Performance补丁和其他补丁。

其他贡献者,bugfinders和测试人员:詹姆斯·H.·汤普森,莫里吉奥门吉尼,沃伊切赫Tryc,卢卡·贝拉,扎克Mocnik,维姆博尼斯,艾玛·哈内克, ,泰德Deppner ,迈克·西蒙斯,亚科Hyvatti。

还有很多来自邮件列表上的人的错误报告/补丁。

向那些帮助我们回答MySQL邮件列表问题的人致敬:

1.9.2文件记录员和翻译人员

以下人员帮助我们编写MySQL文档并在MySQL中翻译文档或错误消息。

  • 保罗杜波依斯

    正在进行帮助,使本手册正确且易于理解。 这包括将Monty和David的英语尝试重写为英语,就像其他人所知道的那样。

  • 金阿尔代尔

    帮助改写蒙蒂和大卫早期的英语尝试。

  • Michael J. Miller Jr.

    对于第一个MySQL手册。 常见问题解答的很多拼写/语言修复(很久以前就变成了MySQL手册)。

  • 严彩琳

    MySQL参考手册的第一个翻译器在2000年初以简体中文编写,Big5和HK编码版本基于该翻译。

  • 杰伊弗莱厄蒂

    手册中 Perl DBI / DBD 部分的 大部分内容

  • Paul Southworth ,Ray Loyzaga

    参考手册的校对。

  • Therrien Gilbert ,Jean-Marc Pouyot

    法语错误消息。

  • Petr Snajdr,

    捷克语错误消息。

  • 雅罗斯瓦夫·莱万多夫斯基

    波兰语错误消息。

  • 米格尔·安赫尔·费尔南德斯·罗伊斯

    西班牙语错误消息

  • Roy-Magne Mo.

    挪威语错误消息和MySQL 3.21.xx的测试。

  • 帖木儿。巴克耶夫

    俄罗斯错误消息。

  • &Filippo Grassilli

    意大利语错误消息

  • Dirk Munzinger

    德语错误消息。

  • 比利克斯特凡

    Slovak错误消息。

  • Stefan Saroiu

    罗马尼亚语错误消息。

  • 彼得费尔

    匈牙利语错误消息。

  • Roberto M. Serqueira

    葡萄牙语错误消息

  • Carsten H. Pedersen

    丹麦语错误消息。

  • Arjen Lentz

    荷兰语错误消息,完成早期的部分翻译(还有关于一致性和拼写的工作)。

1.9.3支持MySQL的软件包

以下是许多人使用MySQL的一些最重要的API /包/应用程序的创建者/维护者列表。

我们不能在这里列出每个可能的包,因为列表将是难以维护的方式。 有关其他软件包,请参阅 http://solutions.mysql.com/software/ 上的软件门户

  • 蒂姆·邦斯,鳄鱼笛卡尔

    对于 DBD (Perl)接口。

  • 安德烈亚斯科尼格

    对于MySQL服务器的Perl接口。

  • Jochen Wiedmann

    用于维护Perl DBD::mysql 模块。

  • 尤金陈

    用于移植PHP for MySQL Server。

  • 格里克里希特

    MySQL 4.1测试和bug搜索。 mysqli 用于MySQL 4.1及更高版本的 新PHP 5.0 扩展(API)。

  • Giovanni Maruzzelli

    用于移植iODBC(Unix ODBC)。

  • Xavier Leroy

    LinuxThreads的作者(Linux上的MySQL服务器使用)。

1.9.4用于创建MySQL的工具

以下是我们用于创建MySQL的一些工具的列表。 我们使用它来表达我们对那些创建它们的人的感谢,因为没有这些我们无法使MySQL成为今天的样子。

  • 自由软件基金会

    从中我们得到了一个优秀的编译器( gcc ),一个优秀的调试器( gdb libc 库(我们借用它 strto.c 来获取一些在Linux中运行的代码)。

  • 自由软件基金会和XEmacs开发团队

    对于一个非常棒的编辑/环境。

  • 朱利安西沃德

    作者 valgrind ,一个优秀的内存检查工具,帮助我们找到了很多在MySQL中很难找到的错误。

  • DorotheaLütkehaus和Andreas Zeller

    对于 DDD (数据显示调试器),它是 gdb 的优秀图形前端 )。

1.9.5 MySQL的支持者

虽然Oracle公司和/或其附属公司持有的所有版权 MySQL server MySQL manual ,我们要认识到以下的公司,这帮助我们融资的发展 MySQL server ,例如通过支付我们开发新的功能,或给我们硬件的发展这个 MySQL server

  • VA Linux / Andover.net

    资助复制。

  • NuSphere

    编辑MySQL手册。

  • 鹳设计工作室

    MySQL网站在1998-2000之间使用。

  • 英特尔

    为Windows和Linux平台上的开发做出了贡献。

  • 康柏

    为Linux / Alpha上的开发做出了贡献。

  • SWsoft公司

    开发嵌入式 mysqld 版本。

  • FutureQuest

    --skip-show-database 选项。

原文