第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 Web 站点
1.6.2 MySQL 邮件列表
1.6.3 MySQL论坛中的MySQL社区支持
1.6.4 MySQL线上交流系统(IRC)中的MySQLMySQL社区支持
1.6.5 MySQL 企业
1.7 如何报告bugs或问题
1.8 MySQL标准的兼容性
1.8.1 MySQL对标准SQL的扩展
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服务器面向关键任务,重载生产系统以及嵌入到大量部署的软件。甲骨文是一个注册甲骨文公司的商标和/或其附属公司。MySQL是甲骨文公司的商标和/或其附属公司,不得使用客户没有甲骨文的书面授权。其他名称可能是各自所有者的商标。

MySQL软件双重许可。用户可以选择使用MySQL软件作为一个开放源产品根据GNU通用公共许可证 (http://www.fsf.org/licenses/) 可以购买一个标准从Oracle商业许可证。查看http://www.mysql.com/company/legal/licensing/ 许可政策的更多信息。

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

重要

报告问题或错误,请使用说明书在1.7节,“如何反馈Bugs或问题”。如果您发现一个敏感的MySQL的安全缺陷 服务器,请立即让我们知道通过发送一个电子邮件消息 < secalert_us@oracle.com >。例外:支持客户应该报告 所有的问题,包括安全漏洞,Oracle支持。

1.1 关于本手册

这是基于8.0版本的MySQL数据库系统参考手册。MySQL8.0中每个小版本之间的差异会在当前文本中标示出来。 (8.0.x).对于许可信息,参阅法律声明.

本手册不适用于老版本的MySQL,因为跟老版本的MySQL有很多不同功能。所以,如果您在使用早期版本的MySQL软件,请参考恰当的手册。例如 MySQL 5.7 参考手册 包含MySQL软件发现的5.7系列。

由于本手册只是作为参考,所以不会提供SQL通用指令或关系数据库概念。同样也不会教您如何使用操作系统或命令行解释器。

MySQL数据库软件在不断的开发中,所以本参考手册也会不断的更新。可以在这里 http://dev.mysql.com/doc/搜索最新版本的手册。当然这里也提供其他格式的,包括:HTML, PDF, 和 EPUB。

本手册的源文件是DocBook XML格式写的。首先使用DocBook XSL stylesheet,然后HTML或其他格式的就会自动产生,对于DocBook,参阅 http://docbook.org/

MySQL源代码以及内置文档是使用Doxygen写的,可在 at http://dev.mysql.com/doc/dev/mysql-server/latest/获得生成的Doxygen内容。 也可以从本地的MySQL源码发布包中生成这些内容,相关说明,参阅 2.8.7节, 生成 MySQL Doxygen 文档内容”.

如果您有关于使用MySQL的问题,可以通过邮件或论坛咨询这些问题, 参见  1.6.2节, “MySQL 邮件列表”, 和 1.6.3节, “论坛中的MySQL社区支持”。 如果您有关于添加或修正本手册个建议,请将它们发送给http://www.mysql.com/company/contact/.

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

1.2 排版和语法惯例

本手册使用了一些排版惯例:

  • 此类型的文本 是用于SQL语句;数据库,表和列名;程序输入和源码,和环境变量。例如: 重载权限表,使用 FLUSH PRIVILEGES 语句。

  • 此类型的文本 输入示例显示

  • 此类型的文本显示可执行程序和脚本的名字,例如:mysql (MySQL命令行客户端程序) 和 mysqld (MySQL服务器可执行文件)。

  • 此类型的文本 用于变量的输入。

  • 此类型的文本 用于强调。

  • 此类型的文本 用于表头来强调特殊的。

  • 此类型的文本 用于指出影响程序运行的程序选项,或者提供信息来使得,程序按照一定的方式产生功能。例如:: The --host 选项 (简写-h)告诉 mysql 客户端程序,或需要连接的MySQL服务器的ip地址

  • 文件名和目录名会这样写: 全局my.cnf 文件位于/etc 目录。

  • 字符序列会这样写: 使用% 字符,来指定一个通配符。

当出现准备在特定程序中执行的命令时,该程序将由位于命令前的提示符指明。 shell> 指明命令将在登录的shell中执行,root-shell> 类似,但是需要做 as root来执行,以及mysql> 表明您需要从mysql 客户端执行语句:

shell> 输入shell命令
root-shell> 使用 root 输入shell命令
mysql> 输入mysql语句

有些情况下可能需要区分不同的系统,以显示该命令需要在不同的环境下执行。例如,在复制架构下,命令可能会带有 masterslave前缀:

master> 在主机上输入mysql命令
slave> 在从机上输入mysql命令

shell 是命令解释程序。On Unix平台, 它通常是一个程序,如 shcshbash。在Windows平台, 等效程序为command.comcmd.exe,通常运行在控制台窗口中。

输入示例中显示的命令或语句时,不要输入示例中给出的提示符。

数据库、表和列名必须带入语句中,为了表名带入是必要的,在本手册中使用了 db_nametbl_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 是带有INTO OUTFILE子句SELECT 语句的简短写法。

省略号还能指明语句的前部分语法元素可重复。在下面的示例中,可给定多个 reset_option值,第1个值后每一个可由逗号分开:

RESET reset_option [,reset_option] ...

对于用来设置shell变量的命令,采用Bourne shell语法给出。如下面的用来设置CC 的环境变量,同时运行configure命令:

shell> CC=gcc ./configure

如果您正使用cshtcsh, 您必须用不同的方式发出命令:

shell> setenv CC gcc
shell> ./configure

1.3 MySQL数据库管理系统概述

1.3.1 什么是 MySQL?

MySQL, 最流行的开源 SQL 数据库管理系统,现在由Oracle公司开发,发布和支持的。

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

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

    数据库是数据的结构化集合。它可以是任何东西,从简单的购物清单到画展,或企业网络中的海量信息。要想将数据添加到数据库,或访问、处理计算机数据库中保存的数据, 需要使用数据库管理系统,如MySQL服务器。计算机是处理大量数据的理想工具,因此,数据库管理系统在计算方面扮演着关键的中心角色,或是作为独立的实用工具, 或是作为其他应用程序的组成部分。

  • MySQL是一种关联数据库管理系统。

    关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大的仓库内。 这种数据库架构被组织为物理文件,以此来优化速度。逻辑模型下,使用对象,例如数据库,表,视图,行和列,提供一个灵活的程序环境。 设置 设置规则来调配不同数据类型之间的关系,例如,不同表之间一对一、一对多、唯一、必须或可选,以及 指针 。 在数据库中强制这些规则,那么一个设计很好的数据库,您的应用程序将永远不会出现不一致、重复、孤行、过期或缺少数据。

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

    它是由ANSI/ISO SQL标准定义的。SQL标准自1986年以来不断演化发展,有数种版本。在本手册中,SQL-92 指得是1992年发布的标准,SQL:1999 指得是1999年发布的标准,“SQL:2003”指得是标准的当前版本。 我们采用术语the SQL standard标示SQL标准的当前版本。

  • MySQL软件是一种开放源码软件。

    “开放源码”意味着任何人都能使用和改变软件。任何人都能从Internet下载MySQL软件,而无需支付任何费用。如果愿意, 您可以研究源码并进行恰当的更改,以满足您自己的需求。MySQL软件采用了GPL(GNU通用公共许可证), http://www.fsf.org/licenses/, to 定义了在不同情况下可以用软件作的事和不可作的事。如果您对GPL不满意,或需要在商业应用程序中嵌入MySQL代码,可从我方购买商业许可版本。更多信息,请参见MySQL许可概述 (http://www.mysql.com/company/legal/licensing/).

  • MySQL数据库服务器具有快速、可靠和易于使用的特点。

    如果它正是您所寻找的,不妨一试。您只需要稍微留意一下或不用理会它,MySQL可以顺畅的运转在台式机或笔记本,可以和其他应用程序同时运行,可以在web服务器上,等等。 如果您决定在机器上只跑MySQL,您可以调整一下设置,来有效的利用所有的内存,CPU效率以及I/O能力。MySQL同样可以利用网络扩展为集群。

    MySQL服务器最初是为处理大型数据库而开发的,与已有的解决方案相比,它的速度更快,多年以来,它已成功用于众多要求很高的生产环境。尽管MySQL始终在不断发展,但目前MySQL服务器已能提供丰富和有用的功能。它具有良好的连通性、速度和安全性,这使的MySQL十分适合于访问Internet上的数据库。

  • MySQL服务器工作在客户端/服务器模式,或嵌入式系统中。

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

    我们还能以嵌入式多线程库的形式提供MySQL服务器,您可以将其链接到您的应用程序,从而获得更小、更快、和更易管理的产品。

  • 有大量可用的共享MySQL软件。

    MySQL服务器具有与我们的用户密切合作开发的一组实用的特性,很可能您所喜欢的应用程序和语言均支持MySQL数据库服务器。

MySQL的官方发音是My Ess Que Ell (而不是 my sequel), 但是我们不介意您的发音是 my sequel 或其他的本土发音方式。

1.3.2 MySQL的的主要特性

下面介绍了MySQL数据库软件的一些重要特性。大部分情况下,适用于所有版本的MySQL,关于当前特性和即将提供特性的更多信息,,请参见适当版本的 简要部分。

内部构件和可移植性

  • 使用C和C++编写。

  • 用众多不同的编译器进行了测试。

  • 能够工作在众多不同的平台上。参阅 http://www.mysql.com/support/supportedplatforms/database.html.

  • 在可移植性方面, 在MySQL5.5及上版本使用CMake进行移植。 之前的版本使用GNU Automake, Autoconf, 和Libtool进行移植。

  • 采用Purify(商业内存溢出检测器)以及GPL工具Valgrind (http://developer.kde.org/~sewardj/)测试MySQL代码。

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

  • 采用核心线程的完全多线程 如果有多个CPU,它能方便地使用这些CPU。

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

  • 使用了极快的“B树”磁盘表(MyISAM)和索引压缩。

  • 添加另一个存储引擎相对简单。如果打算为内部数据库添加一个SQL接口,该特性十分有用。

  • 通过使用优化的nested-loop join,实现极快的连接。

  • 存储器中的哈希表用作临时表。

  • SQL函数是使用高度优化的类库实现的,运行很快。通常,在完成查询初始化后,不存在存储器分配。

  • 服务器可作为单独程序运行在客户端/服务器联网环境下。它也可作为库提供,可嵌入(链接)到独立的应用程序中。这类应用程序可单独使用,也能在网络环境下使用。

数据类型

语句和函数

  • SELECTWHERE 子句中,提供完整的操作符和函数支持。例如:

    mysql> SELECT CONCAT(first_name, ' ', last_name)
        -> FROM citizen
        -> WHERE income/dependents > 10000 AND age > 30;
    
  • 对SQL的 GROUP BYORDER BY子句全面支持。支持聚合函数 (COUNT(), AVG(), STD(), SUM(), MAX(), MIN(), and GROUP_CONCAT())。

  • 支持LEFT OUTER JOINRIGHT OUTER JOIN,并采用标准的SQL和ODBC语法。

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

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

  • 支持特殊的MySQLSHOW 语句,来获取数据库、存储引擎、表和索引的相关信息。 支持INFORMATION_SCHEMA 库, 根据标准SQL实现。

  • EXPLAIN 用于显示优化器如何处理查询。

  • 函数名与表名或列名不冲突。例如,ABS是有效的列名。唯一的限制在于,调用函数时,函数名和随后的符号 ( 之间不能有空格,参见  9.3节, “关键字和保留字”

  • 可以将不同数据库的表混在相同的查询中。

安全

  • MySQL有一套十分灵活和安全的权限和密码系统,允许基于主机的验证。连接服务器时,所有的密码均采用加密形式,从而保证密码的安全。

可伸缩性和限制

  • 支持大型数据库,我们使用含有5千万记录的MySQL服务器。同时我们还知道,有些用户将MySQL作为含有20万个表和50亿条记录的数据库。

  • 单表支持高达64个索引。每个索引可由1到16个列或列元素组成。 InnoDB表的索引的最大宽度是767字节或3072字节。详情查看 15.8.1.7节, “InnoDB表的限制”。 而MyISAM 表索引的最大宽度是1000字节。参阅 16.2节, “MyISAM 存储引擎”. 索引可以使用具备CHAR, VARCHAR, BLOB,或 TEXT 列类型前缀。

连接性

  • 客户端连接MySQL服务器可以使用下面几个协议:

    • 在任何平台上,客户端可使用TCP/IP sockets 连接到MySQL服务器。

    • 在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客户端可以是使用很多语言编写,参见第27章, 连接器和API.

  • Connector/ODBC (MyODBC)接口为使用ODBC(开放式数据库连接性)连接的客户端程序提供了MySQL支持。例如,可以使用MS Access连接到您的MySQL服务器。 客户端可运行在Windows或Unix平台上。提供了MyODBC源。支持所有的ODBC 2.5函数,以及众多其他函数。 MySQL 连接器/ODBC 开发者指南.

  • Connector/J接口为使用JDBC连接的Java客户端程序提供了MySQL支持。客户端可运行在Windows或Unix平台上。提供了Connector/J源码。参见 MySQL 连接器/J 5.1 开发者指南.

  • MySQL Connector/Net能使开发者轻松的创建具有安全、高性能的数据连通性的 .NET应用程序。 它实现了ADO.NET所需的接口,同时集成到ADO.NET工具中。开发者可以使用他们选择的.NET语言建立应用程序。Connector/Net是完全由ADO.NET驱动器管理,且100%使用c#编写。 参见 MySQL 连接器/Net 开发者指南.

本地化

  • 服务器可使用多种语言向客户端提供错误消息。参阅10.2节, “设置错误信息语言”.

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

  • 所有数据均以所选的字符集保存。

  • 分类和校对是根据默认的字符集进行的,可以在MySQL服务器启动的时候改变。(参阅 10.1.3.2节, “服务器字符集设置和校对”)。要想查看高级分类的示例,请参见Czech分类代码。MySQL服务器支持众多不同的字符集,这类字符集可在编译时和运行时指定。

  • 服务器是去可以动态的修改,同事,相互独立的客户端可以指定自己的时区,参见 10.6节, “MySQL 服务器时区支持”.

客户端和工具

  • MySQL 包含多个客户端和实用程序。这些包含命令行程序,例如 mysqldumpmysqladmin, 和图形程序,例如 MySQL 工作台.

  • MySQL服务器提供了对SQL语句的内部支持,可用于检查、优化和修复表。通过 mysqlcheck 客户端,可在命令行上使用这类语句。MySQL还包括 myisamchk,这是一种很快的命令行使用工具,可用于 MyISAM表上执行这类操作。参见第4章, MySQL 程序.

  • MySQL 程序可以调用--help-? 选项来获取联系帮助信息。

1.3.3 MySQL的历史

我们最初的目的是使用 mSQL 数据库系统,通常通过使用我们自己的快速低级别的(ISAM)来连接表,然而,经过一些测试后,我们得出的结论是mSQL 不够快,也不够灵活,从而不满足我们的需求。这样就导致了一个新的SQL接口的产生,一个与mSQL几乎相同的API接口. 这个API接口的设计是让使用 mSQL 第三方代码能够更方便的移植到MySQL中。

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

MySQL 海豚(our logo)的名字叫Sakila, 它是从我们的海豚名字 大赛中用户推荐的众多名字中选出的。 获胜的名字是由来自非洲斯威士兰的开源软件开发商Ambrose Twebaze提交的。根据Ambrose的说法,女性的名字“Sakila”在斯瓦蒂语中有根,这是斯威士兰的当地语言。Ambrose也是坦桑尼亚阿鲁沙市的一个小镇,靠近Ambrose的家乡乌干达。

1.4 MySQL 8.0新内容

本节将概述MySQL8.0中新增,弃用和移除的内容。相邻的小节中将列举出MySQL 8.0服务器选项和变量的增加、弃用和移除。参见 1.5 节, “MySQL 8.0中服务器、状态变量和选项的添加、弃用和移除”.

MySQL 8.0添加的功能

MySQL 8.0中添加了以下功能:

  • 数据字典  这些增强功能被添加:

    • MySQL服务器现在将数据库对象信息并入到事务性数据字典中,以前版本的MySQL,数据字典存储在元数据文件和非事务表中。

      MySQL 8.0.0 中InnoDB 继续使用自身的数据字典。

      更多关于改功能的信息,参见 第14章, MySQL 数据字典

  • 账户管理  MySQL现在支持角色,可以被用来收集权限。角色可以被创建和删除,角色可以被授予或收回。账户可用已激活角色可以从众多被授予的角色中选取,同时可以在账户的会话期间修改。 更多信息,参见6.3.4节, “使用角色”

  • InnoDB 增强.  以下是InnoDB 的增强:

    • 每次增长值变化时会将最大增长值写入在线日志,并且每次chenpoint的时,会保存到系统引擎表中。这种改变使得服务器重启后,自动增长计数器中的当前最大值可以固定不变。 此外:

      • 服务器重启不再取消AUTO_INCREMENT = N 选项的效果。 如果您将自动增长器初始化为一个指定的值,或者修改为一个比较大的值,服务器重启后的值是固定。

      • 服务器重启后,紧跟着的是一个 回滚 操作,而回滚不再导致重新分配自动增长值给回滚事务。

      • 如果您将一个AUTO_INCREMENT的值,改为一个比当前值更大的值(例如, UPDATE 操作),新的增量值固定后,修改以后的数据,后续的 INSERT 操作将会采用新的增量值。

      更多信息,参见 15.8.1.5节, “InnoDB中的AUTO_INCREMENT处理”, and InnoDB 初始化AUTO_INCREMENT计数器.

    • 当遇到索引树损坏时,InnoDB在重做日志中添加损坏的标记,同时InnoDB 每次检查点时,将内存中有损坏标记的数据写到系统表中。在恢复期间 InnoDB会同时从这两个地方读取被标记损坏,且将内存表和索引对象进行合并。

    • The InnoDB memcached插件支持多重 get 操作 (一次memcached 查询获取多个键值对)和范围查询。参见 15.19.4 节, “InnoDB memcached 多重获取和范围查询支持”.

    • innodb_deadlock_detect,一个新的动态配置选项,被用于禁用死锁检测。 在高并发系统中,当很多进行等待相同的锁时,死锁检测会使得服务器变慢。有时在发生死锁时,关闭死锁检测同时结合 innodb_lock_wait_timeout设置 会提高服务器的效率。

    • INFORMATION_SCHEMA中新加表 INNODB_CACHED_INDEXES, 用来反馈InnoDB buffer pool中每个索引的索引页缓存的数量。

    • 所有InnoDB 临时表会在共享临时表空间ibtmp1中创建。

    • InnoDB 表空间加密功能 支持重做日志和undo日志数据加密。 重做日志数据加密, 和 UNDO日志数据加密

    • InnoDB 支持执行 SELECT ... FOR SHARESELECT ... FOR UPDATE 锁定读语句时,带有NOWAITSKIP LOCKED 选项。如果请求行已经被其他事务锁定, NOWAIT 会立刻返回结果。 SKIP LOCKED 将锁定的行从结果中移除。参见 NOWAIT和SKIP LOCKED的锁定读并发性.

      SELECT ... FOR SHARE 替代 SELECT ... LOCK IN SHARE MODE,但是 LOCK IN SHARE MODE 任然支持向后兼容。因此,FOR UPDATEFOR SHARE 支持 NOWAIT, SKIP LOCKED, 以及 OF tbl_name 选项这些语句是等价的。参见 13.2.10 节, “SELECT 语法

      OF tbl_name 是将查询锁应用在表上。

    • 支持本地API通过ALTER TABLE选项来对本地分区表进行添加分区, 删除分区, 合并分区 , 整理分区, 和 重建分区 也可以在子句中带有 ALGORITHM={COPY|INPLACE}LOCK

      删除分区 结合 ALGORITHM=INPLACE删除分区中的数据和删除分区, DROP PARTITION 结合 ALGORITHM=COPYold_alter_table=ON 来重建分区表,或尝试把数据从已经被删除的分区中,移到一个具有兼容PARTITION ... VALUES定义的分区中。 已经被删除的数据不能移动到另一个分区。

    • InnoDB存储引擎使用全局的MySQL数据字典而不是使用自身的特殊的数据字典,更多有关数据字典的信息,参见 第14章, MySQL 数据字典

    • mysql系统表和数据字典表创建在MySQL数据目录下,一个文件名叫mysql.ibd的单独表空间中。 之前的版本中,这些表是创建在mysql 数据库目录下的各自独立InnoDB 表空间文件中。

    • 下面是介绍MySQL8.0中undo表空间的改变:

      • undo表空间的数量既可以在线调整,也可以在服务器启动时使用已存在的 innodb_undo_tablespaces 配置选项。这项变化允许伴随这数据的增长,而添加undo表空间和回滚段。

      • innodb_undo_log_truncate 默认开启,参见 15.7.8 节, “截断Undo表空间

      • innodb_undo_tablespaces 的默认值从0变为2,这就意味着回滚段会在两个隔离的undo表空间中,而不是默认的 InnoDB系统表空间。要想阶段undo日志,至少需要两个undo表空间。

      • innodb_rollback_segments 配置项,定义每个undo表空间中回滚段的数量。在以前的版本中, innodb_rollback_segments 是一个全局的设置,用来指定MySQL实例中回滚段的总数was a global setting that specified the total number 这项改变增加了并发事务可获得的回滚段数量,而且,更多的回滚段增加了并发事务使用不同的回滚段的可能性,从而减少资源争用。

      • innodb_undo_logs 配置项被移除了, innodb_rollback_segments 和它有着相同的功能,从而替代了它。

  • JSON 增强。  以下是对MySQL的JSON功能的增强或补充:

    • 添加 ->> (inline path) 运算符, 这相当于 JSON_EXTRACT()结果中调用 JSON_UNQUOTE()

      这是对MySQL5.7中列路径运算符的详细描述。 -> col->>"$.path" 等同于 JSON_UNQUOTE(col->"$.path")这个运算符可以在任何使用 JSON_UNQUOTE(JSON_EXTRACT())的地方使用,比如, SELECT 列显示, WHEREHAVING 子句, 以及 ORDER BYGROUP BY 子句。更多信息,参见运算符的描述,同样可以参见 well as 12.16.7 节, “JSON路径语法”

    • 添加了JSON 聚合函数 JSON_ARRAYAGG()JSON_OBJECTAGG()JSON_ARRAYAGG() 将列或表达式作为内容,并将结合聚合为单个 JSON 数。表达式不一定非要是JSON值,表达式可以计算任何MySQL数据类型。 JSON_OBJECTAGG() 将两个列或表达式,作为一个键或一个值,然后以 JSON 对象形式返回单个结果。更多信息和示例,参见 12.18节, “聚合函数(GROUP BY)”

    • 添加JSON 实用函数 JSON_PRETTY(), 用易读的格式输出一个已存在的JSON值, 每个JSON对象成员或组值打印在不同的行,并且子对象或组,与对应的父对象或组有两个空格对齐。

      这个函数同样可以将一个字符串解析为一个JSON值。

      更多详细信息和例句,参见 12.16.6节, “JSON 实用函数

    • 当在查询中对 JSON 值进行ORDER BY排序, 每个值都是排序键变长的一部分,而不是一个固定1k的一部分。在很多情况下,这样更节省空间,例如,一个标准的 INT 甚至是 BIGINT值实际只需要很少的字符,所以剩下的空间(最多90%或更多) 都是被填充。这个变化对性能有以下好处:

      • sort buffer空间的使用更高效,以至于filesorts不必过早或频繁的这意味着可以在内存中对更多的数据进行排序,避免不必要的磁盘访问。

      • 较短的键之间进行比较将比长键更快,这样可以显著的提高性能。 对于完全在内存中进行排序,以及需要从磁盘读写的排序来说,这都是不错的选择。

    • MySQL 8.0.2中添加了对JSON列值的局部原地更新的支持,这比完成删除现有的JSON值然后写一个新值更高效,以前更新任何 JSON列都是那样做的。想使用这个,那么在update时必须使用 JSON_SET(), JSON_REPLACE(), 或 JSON_REMOVE()。 不能将新元素添加到正在更新的JSON文档中; 文档的值不能比更新之前的值占用更多的空间。参见 11.6 节, “JSON 数据类型”, 来获得更详细的讨论。

    • 添加JSON 实用函数 JSON_STORAGE_SIZE()JSON_STORAGE_FREE()JSON_STORAGE_SIZE()在任何部分更新之前,会返回一个JSON文档的二进制模式所需的存储空间(见前一项)。 JSON_STORAGE_FREE() 在使用 JSON_SET()JSON_REPLACE()做部分更新后,会显示JSON类型的列表中剩余的空间大小 JSON 如果新值(二进制)小于之前的值,那么这个值就大于0。

      同样每个函数都接收JSON文档中的一个有效字符串,对于这个值, JSON_STORAGE_SIZE()返回JSON文档转换后的二进制所使用的空间 对于一个含有JSON文档的字符串表达式的变量 JSON_STORAGE_FREE()返回0。 如果参数不能解析为一个有效的JSON文档(非空),则该函数将产生一个错误,如果参数为NULL.,测返回NULL

      更多信息和示例,参见 12.16.6 节, “JSON 实用函数”

      JSON_STORAGE_SIZE()JSON_STORAGE_FREE() 的应用。

    • 在MySQL 8.0.2.中添加了对XPath 表达式范围的支持,例如 $[1 到 5]。同样在此版本中支持 last关键词和相对寻址,例如, $[last] 总是选择数组中最后(最高编号)的元素,同时 $[last-1]是最后元素前面的一个元素。 last 和表达式同样可以使用在范围定义中,例如: $[last-2 到 last-1] 返回一个数组中的两个元素。参见 搜索和修改 JSON 值, 来获得额外信息和示例。

  • 优化器  优化器增强:

    • MySQL现在支持隐形索引”。隐形索引”不会被优化器使用,单也需要正常维护。默认情况下,该索引是可见的。 隐形索引”使得 可以在不做更合更改的情况下,测试移除索引的查询性能效果成为可能。 参见 8.3.11节, 隐形索引”

    • MySQL 现在只是递减索引:DESC 在索引定义中将不再被忽略,因为存储的键值是降序的。在此之前,反向扫描索引会造成严重的性能问题, 但是用之前的命令还扫描降序索引,就会变得更高效。同样 当最有效的扫描顺序混合了某些列的升序和其他列的降序时, 降序索引可以让优化器选择复合索引。 参见 8.3.12节, “降序索引”

  • 公共表表达式 MySQL 现在支持公共表表达式,包含非递归和递归。公共表表达式允许使用指定的临时结果集,通过允许在WITH 子句 之前的SELECT 语句或包含其它语句。更多信息,参见。 13.2.11.9节, “WITH 语法 (公共表表达式)”

  • 内置临时表 TempTable 存储引擎替代了 MEMORY 存储引擎作为内存中默认的内置临时表存储引擎。 TempTable存储引擎为 VARCHARVARBINARY 列提供更高效的存储。 internal_tmp_mem_storage_engine 会话变量定义了内存临时表的存储引擎。变量值只允许 TempTable (默认) 和 MEMORYtemptable_max_ram 配置项定义数据在写到磁盘前,内存中TempTable存储引擎能使用的最大内存数量。

MySQL 8.0中弃用的功能

下面的功能都是MySQL8.0中已弃用的,或者在尤其版本中将会被弃用的功能。如果显示了替代方案,则应该更新应用程序以使用它们。

MySQL 8.0中移除的功能

下面显示的表示在MySQL8.0中已经被弃用或被移除,如果显示了替代方案,则应该更新应用程序以使用它们。

  • 数据字典提供数据库对象信息,以至于服务器不再需要检查数据目录中的目录名称来查找数据库。因此 --ignore-db-dir 选项和 ignore_db_dirs 系统变量已经没用,所以被移除了。

  • 系统变量sync_frm 也被移除了,因为 .frm文件已经被弃用了。

  • secure_auth 系统变量和 --secure-auth 客户端选项被移除。

  • 这些与加密相关的被移除:

    可以考虑使用 AES_ENCRYPT()AES_DECRYPT() 来代替那些被删除的加密函数。

  • 在MySQL 5.7中,多个名称下可用的几个空间函数被弃用,以使空间函数的名称更一致。 我们的目的是,如果这个函数是执行精确操作,或者它与MBR 一起进行基于最小边界矩形的操作。那么这个函数将会 ST_ 作为前缀命名。在MySQL 8.0中,被弃用的函数已经移除, 只留下相应的ST_ and 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.15.4节, “从WKB值创建几何值的函数” 中描述的函数,以前可以接受WKB字符串或几何参数。现在不允许,而且会产生错误。可以查看指南中将查询从几何参数中移除这一节。

  • 解析器不再将\N视为SQL语句中NULL的同义词。而是使用使用NULL代替。

    对数据以文本文件进行操作时,遇到NULL不会影响我们使用LOAD DATA INFILESELECT ... INTO OUTFILE操作,而且继续使用\N来替换。 参见 13.2.7节, “LOAD DATA INFILE 语法.

  • PROCEDURE ANALYSE() 语法被移除。

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

    对于 C API, MYSQL_OPT_SSL_ENFORCEMYSQL_OPT_SSL_VERIFY_SERVER_CERT 选项,相当于客户端--ssl--ssl-verify-server-cert选项被移除 ,同时使用MYSQL_OPT_SSL_MODESSL_MODE_REQUIREDSSL_MODE_VERIFY_IDENTITY 来替代。

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

  • 服务器端 --ignore-builtin-innodb 想选和ignore_builtin_innodb 系统变量被移除。

  • 服务器不再将MySQL5.1之前含有特殊字符的的数据库,用添加一个#mysql50#前缀的方式,来将数据名转换为5.1格式。 因为 mysqlcheck 中的选项--fix-db-names--fix-table-names,使得这些转换不再执行。 ALTER DATABASE 的子句 UPGRADE DATA DIRECTORY NAMECom_alter_db_upgrade 状态变量被移除。

    只支持主版本升级(例如, 5.0 升级到 5.1, 或 5.1 升级到 5.5), 所以没有必要将老的5.0数据库名改为当前的版本。换个思路,可以将MySQL5.0安装升级到MySQL5.1或最近版本。

  • mysql_install_db 程序从MySQL发行版冲移除。 数据目录的初始化需要调用 mysqld 加上 --initialize--initialize-insecure 选项 此外,被mysql_install_db调用的 mysqld的选项--bootstrap被移除。同时CMake 中控制安装位置的选项 INSTALL_SCRIPTDIR也被移除了。

  • 通用分区处理程序已从MySQL中移除。为了支持对给定的表进行分区,创建表的存储引擎必须提供自己的 (本地) 分区处理程序。 --partition--skip-partition 选项也已从MySQL中移除,而与分区相关的条目也不再显示在 SHOW 插件INFORMATION_SCHEMA.PLUGINS 表中。

    MySQL中目前提供本地分区支持的存储引擎只有 InnoDBNDB;而其中,在MySQL 8.0中只有 InnoDB 支持,所以在MySQL 8.0中想用其他任何存储引擎创建分区表都会失败。

    升级的影响  不支持使用InnoDB以外的存储引擎(如,MyISAM)从MySQL 5.7 (或更早) 到 MySQL 8.0 直接升级分区表。 处理这样的表有两个选择:

    将服务器升级到MySQL 8.0之前,必须为每个非InnoDB分区表执行上面两个操作之一,否则,升级后表不能使用。

    有这样的一个事实就是,有些存储引擎不支持分区表,所以在执行创建语句时会失败,并出现错误(ER_CHECK_NOT_IMPLEMENTED), 所以您必须确保一个就版本的dump文件中的任何语句,在导入到MySQL 8.0服务器中创建分区表时,不包含指定的索引,如不支持本地分区的MyISAM存储引擎。如果存在,你可以通过以下任意一种操作来达到这一点:

    • 除了InnoDB,删除分区表CREATE TABLE语句中任何存储引擎的引用。

    • 将存储引擎指定为InnoDB,或者允许InnoDB作为表的默认存储引擎。

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

  • INFORMATION_SCHEMA中不再维护系统变量信息和状态变量信息。 GLOBAL_VARIABLES, SESSION_VARIABLES, GLOBAL_STATUS, SESSION_STATUS这些表已经被移除,转而使用相应的Performance Schema 表代替。参见 25.11.13 节, “Performance Schema 系统变量表”, 和 25.11.14 节, “Performance Schema 状态表里表”。 此外,系统变量 show_compatibility_56也被移除了,它是只是用于将 INFORMATION_SCHEMA 表中的系统和状态变量信息迁移到Performance Schema 表中, 所以现在不再需要。 这些状态变量也被移除了: Slave_heartbeat_period, Slave_last_heartbeat, Slave_received_heartbeats, Slave_retried_transactions, Slave_running。它们提供的信息现在都可以在Performance Schema表中获得,参见 迁移到Performance Schema 的系统和状态变量表

  • libmysqld库已经被移除,与之一同被移除的还有:

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

    • CMake WITH_EMBEDDED_SERVER, WITH_EMBEDDED_SHARED_LIBRARY, 和 INSTALL_SECURE_FILE_PRIV_EMBEDDEDDIR 选项

    • (未公开) mysql --server-arg 选项

    • The mysqltest --embedded-server, --server-arg, 和 --server-file 选项

    • mysqltest_embeddedmysql_client_test_embedded test programs

  • mysql_plugin被移除,替代方案是,在服务器启动时使用 --plugin-load--plugin-load-add 选项,或者,在服务器运行时,使用 INSTALL PLUGIN 语句。

  • 下面列举的服务器错误代码已经北邮使用,统一已经别移除了,所以对这些错误进行专门测试的应用程序也应该更新。

    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_LOCKSINNODB_LOCK_WAITS 表,现在已被移除,相应的使用Performance Schema的 data_locksdata_lock_waits 表来代替它们。

    提示

    在 MySQL 5.7 中, INNODB_LOCKS 表中的LOCK_TABLE列 和sys 模式 innodb_lock_waitsx$innodb_lock_waits 视图中的locked_table 列包含模式名/表名。 在 MySQL 8.0中,data_locks 表和 sys 模式视图包含的是单独模式名和表的名列。参见  26.4.3.9 节, “innodb_lock_waits 和 x$innodb_lock_waits 视图”

  • InnoDB 不再支持压缩临时表。当innodb_strict_mode 是启用(默认)状态时, 如果指定了 ROW_FORMAT=COMPRESSEDKEY_BLOCK_SIZE ,则 CREATE TEMPORARY TABLE 会返回一个错误。假如 innodb_strict_mode 是禁用状态,则发出告警,并且临时表是以非压缩行模式被创建。

  • 当在MySQL数据目录之外创建表空间数据文件时,InnoDB不在创建 .isl 文件 (InnoDB 符号连接文件) 。现在重做日志记录可以用来定位远程表空间。

    由于这个变化,当服务器脱机时,手动的修改.isl 文件来移动表空间将不再支持了。

  • 下面InnoDB 文件格式的配置参数被移除:

    • innodb_file_format

    • innodb_file_format_check

    • innodb_file_format_max

    • innodb_large_prefix

    这些参数,在MySQL 5.1中创建与早期版本相兼容的InnoDB表,这些配置参数是必要的,但是现在MySQL 5.1已经走到了尽头,所以这些参数也将不再需要。

    从Information Schema 的表 INNODB_SYS_TABLES and INNODB_SYS_TABLESPACES 中移除了FILE_FORMAT列。

  • XA事务中支持两阶提交的系统变量 innodb_support_xa被移除。但是InnoDB对 XA事务进行两阶提交还是支持。

  • DTrace支持被移除。

1.5 MySQL 8.0中服务器和状态变量以及选项的添加、弃用和移除

这一节展示在MySQL 8.0中被移除、被弃用和首次添加的服务器变量、状态变量以及选项。

适当的情况下,每个部分中的添加、删除或弃用的变量和选项都会提供一个单独的列表。

在MySQL 8.0中引入的选项和变量

下面的系统变量,状态变量,以及选项都是MySQL 8.0中都是新引入的,在之前的版本系列中是没有的。

MySQL 8.0中弃用的选项和变量

下面介绍在MySQL 8.0中 被弃用的系统变量,状态变量和选项。

  • symbolic-links: 允许对MyISAM 表进行符号链接,在 MySQL 8.0.2被弃用。

MySQL 8.0中移除的选项和变量

下面介绍在MySQL 8.0中 被移除的系统变量,状态变量和选项。

  • bootstrap: 用于MySQL初始化脚本。在 MySQL 8.0.0中移除。

  • Com_alter_db_upgrade: ALTER DATABASE ... UPGRADE DATA DIRECTORY NAME 语句统计。在 MySQL 8.0.0中移除。

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

  • ignore-db-dir: 视目录为非数据目录,即:忽略某某某目录。在 MySQL 8.0.0 中移除。

  • ignore_db_dirs: 同上

  • Innodb_available_undo_logs: 显示InnoDB回滚段的总数,它不同于innodb_rollback_segments是显示active回滚段的数量。在 MySQL 8.0.2 中移除。

  • innodb_checksums: 启用InnoDB校验。在 MySQL 8.0.0 中移除。

  • innodb_disable_resize_buffer_pool_debug: 禁用InnoDB buffer pool 大小调整。在 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不是用next-key 锁定,而仅使用row-level锁定。在 MySQL 8.0.0 中移除。

  • innodb_stats_sample_pages: 分布式系统中索引页的取样数。在 MySQL 8.0.0 中移除。

  • innodb_support_xa: 启用InnoDB支持 XA 二阶提交。在 MySQL 8.0.0 中移除。

  • innodb_undo_logs: 定义InnoDB使用的undo日志量(回滚段),它有个别名innodb_rollback_segments。在 MySQL 8.0.2 中移除。

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

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

  • skip-partition: 不启用自定义分区。在 MySQL 8.0.0 中移除。

  • Slave_heartbeat_period: 从机上复制的心跳间隔,时间Wie秒。在 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: 从机服务器的状态(slave I/O 线程状态)。在 MySQL 8.0.1 中移除。

  • sync_frm: 默认情况下,磁盘同步生成.frm。在 MySQL 8.0.0 中移除。

  • temp-pool: 使用这个选项会导致大部分的临时文件,在创建是使用一组简洁的文件名,而不是每个新文件有一个唯一的名称。在 MySQL 8.0.1 中移除。

1.6 MySQL 信息源

本节列出了您可能发现的其他信息的来源,如MySQL web站点、邮件列表、用户论坛和在线交流系统。

1.6.1 MySQL web网站

MySQL文档的主要web站点是 http://dev.mysql.com/doc/。可以在线查看和下载MySQL参考手册、MySQL连接器等等。

这里MySQL开发人员会提供一些新特性和即将产生的特性的信息 MySQL Server Blog

1.6.2 MySQL 邮件列表

在本节中介绍了MySQL邮件列表,并给出了使用邮件列表的指南。订购邮件列表后,将以电子邮件消息的形式收到所有已记录的信息。您也可以将自己的问题和解答发送至邮件列表。

要想订购本节所介绍的邮件列表或取消订购,请访问http://lists.mysql.com/。对于大多数邮件列表,可选择能够获取单独消息的正规列表版本,或选择按天发布的包含大量消息的文摘版本。

不要将订购信息或取消订购的信息发送到邮件列表,原因在于,这类消息将自动分发给数千位其他用户。

在您的所在地,可能有很多MySQL邮件列表的订户。如果是这样,该地点可能会有本地邮件列表,这样,从lists.mysql.com 发出的消息将被传播到本地列表。在这类情形下,请与您的系统管理员联系,添加或删除本地MySQL列表。

如果希望将邮件列表的信息传送到邮件程序的邮箱中,请根据消息标题设置过滤器。可以使用列表ID: 或投递至: 识别列表消息的标题。

MySQL列表包含:

  • 通告

    该列表用于通告新的MySQL版本和相关程序。这是种低容量列表,所有的MySQL用户均应订购它。

  • mysql

    这是关于一般MySQL讨论的主要列表。请注意,对于某些主题来说,在更专门的列表中会得到更好地讨论。如果将问题张贴到了错误的列表,可能不会得到回答。

  • bugs

    该列表面向那些希望随时了解自上次MySQL版本发布以来已通报事宜的人员,或希望积极参与缺陷寻找和更正进程的人员。 请参见Section 1.7, “如何反馈bug和问题”

  • internals

    该列表面向那些与MySQL代码打交道的人员。它也是讨论MySQL开发并张贴补丁的论坛。

  • mysqldoc

    列举那些致力于MySQL文档的人员,

  • benchmarks

    该列表面向任何对性能事宜感兴趣的人员。讨论主要集中在数据库性能方面(不限于MySQL),也包括更广的类别,如内核性能、文件系统、磁盘系统等。

  • packagers

    该列表主要讨论包装和分发MySQL方面的问题。这是供分发版维护人员交流MySQL打包事宜的论坛,为的是确保在所有支持的平台和操作系统上,MySQL的外观和感觉尽可能类似。

  • java

    该列表主要讨论MySQL服务器和Java方面的问题。它主要讨论JDBC驱动程序,包括MySQL Connector/J。

  • win32

    该列表涵盖了在Microsoft操作系统环境下(如Windows 9x, Me, NT, 2000, XP和2003)与MySQL软件有关的所有主题。

  • myodbc

    该列表涵盖了与使用ODBC连接到MySQL服务器有关的所有主题。

  • gui-tools

    该列表涵盖了与MySQL GUI工具有关的所有主题,例如,MySQL工作台。

  • cluster

    MySQL集群讨论的列表。

  • dotnet

    MySQL服务器和.NET平台方面的讨论,主要与 MySQL Connector/Net相关的列表。

  • plusplus

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

  • perl

    涵盖Perl对MySQL支持,以及DBD::mysql的所有主题

如果无法从MySQL邮件列表或论坛获得问题解答,一种选择就是购买Oracle的支持服务。这样,您就能直接与MySQL开发人员联系。

下面介绍了一些英语以外其他语言的MySQL邮件列表。这些邮件列表不是由Oracle运营的。

1.6.2.1 邮件列表使用指南

请不要在浏览器中使用HTML模式发送邮件消息。因为许多用户不会使用浏览器阅读邮件。

当您在回答一个邮件列表的问题时,如果您认为您的回答会让很多人有兴趣,那么您可以将其列在邮件列表上,而不是单纯的回复给那个问问题的人。 这样试着让您的回答是更多人从中收益,当然在您贴在邮件列表前,您需要确保您的回答不是重复的。

邮件内容简明扼要即可,不需要把整个原文加进去。

当解决方案被单独发给您,而不是从邮件列表上,总结内容,并将摘要发送到邮件列表上是一种很好的网络礼仪,这样其他人也可从您的回复中收益,或者其他人可以帮您解决问题。

1.6.3 MySQL 论坛上的社区支持

http://forums.mysql.com 是一个很重要的社区资源,上面有各种可用的论坛,分为一些类型:

  • 移植

  • MySQL 用法

  • MySQL 连接器

  • 编程语言

  • 工具

  • 第三方应用程序

  • 存储引擎

  • MySQL 技术

  • SQL 标准

  • 业务

1.6.4 IRC在线MySQL社区支持

除了MySQL邮件列表之外,在IRC上也可以找到有经验的社区人士。 以下是我们已知的目前最好的网络/频道:

freenode (对于服务器参见 http://www.freenode.net/ )

  • #mysql 主要是MySQL问题,但是也欢迎其他数据库和一般SQL问题,与MySQL一起使用PHP、Perl或 C方面的问题也是很常见的。

  • #workbench 主要是MySQL工作台相关的问题和想法,同样也是可以与MySQL工作台开发人员交流的好地方。

如果您正在寻找IRC客户端,以便连接到IRC网络,请访问 xChat (http://www.xchat.org/). X-Chat (GPL 许可) 即可以用于Unix平台,也适用于Windows平台 (免费的Windows 版本的 X-Chat 可在这里下载 http://www.silverex.org/download/)。

1.6.5 MySQL 企业版

Oracle以MySQL企业版的形式提供技术支持。对于依赖于MySQL DBMS来进行关键业务的生产应用程序的组织泪说,MySQL企业版是一个商业订阅服务。其中包括:

  • MySQL 企业版服务器

  • MySQL 企业版监控

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

  • MySQL 知识库

  • 24x7 技术和咨询服务

MySQL企业版有多个级别,以至于您可以灵活的选择最适合您的服务级别。更多信息,请参阅 MySQL 企业版

1.7 如何反馈bugs和问题

在发送问题的bug前,请验证它真的是一个bug,并且没有被反馈过:

  • 首先在 http://dev.mysql.com/doc/搜索到MySQL手册。 我们尽力将新发现的问题的解决方案更新到手册中,来使得手册保持是最新的状态。 此外,随手册附带的发布说明也特别有用,因为很有可能问题的解决方案包含在新版本中。发布说明也是在手册的位置提供。

  • 如果您的SQL语句报错,请仔细检查您的语法,假如找不到错误,很有可能是您当前版本的MySQL服务器不支持您使用的语法,如果你使用的是最新版本, 并且手册中也涵盖您正在使用的语法,那么MySQL服务器不支持您的语句。

    如果手册涵盖了您使用的语法,但是您的MySQL服务器版本比较老,那么您应该检查一下MySQL更改历史,帮你了解何时实现了你当前使用的语法。在这种情况下,您可以选择升级到最新版本的MySQL。

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

  • 搜索数据库bugs是否已修复或被提交 http://bugs.mysql.com/

  • 搜索MySQL邮件列表归档 http://lists.mysql.com/。请参见 1.6.2 节, “MySQL 邮件列表”

  • 您同样可以使用 http://www.mysql.com/search/ 来搜索MySQL web站点上的所有网页(包括手册)。

如果您在手册、bug库或者邮件归档中找不到问题的解决方案,请联系您所在区域的MySQL专家。如果您仍然找不到问题的解决方案,请使用下面的指南反馈这个bug给我们。

反馈bug的正常方式是,访问 http://bugs.mysql.com/ ,这是我们的bug库网址。这个库是公开的,任何人都可以浏览和搜索,如果您登录到系统中,您就可以新建一个报告。

被提交到bug库中的bug http://bugs.mysql.com/,会在发行说明中提示被修复。

如果您在MySQL服务器上发现了一个敏感的安全漏洞,请立即像我们发送邮件,邮件地址: 。 除此之外,还应该反馈所有问题,包括安全漏洞给oracle支持http://support.oracle.com/.

通过邮件列表可以和其他用户探讨问题1.6.2 节, “MySQL 邮件列表”

写一个好的bug报告需要耐心,但是第一次做好了,就会为你我都节约时间。一个好的bug报告,包含完整的bug测试案例,这使得我们很可能在下个版本中修复这个bug。 这部分可以帮助您正确的写报告,这样你就不会浪费时间做些对我们没有任何帮助的事情,所以请仔细阅读这部分,并确保所有信息的描述都在您的报告中。

最好是在您提交报告前,使用最新发布版或开发版的MySQL测试这个问题,任何人都应该能够 在测试案例中使用 mysql test <script_file来重现bug,或者在bug报告中包含您重现此bug所运行的shell或Perl脚本。 任何能够被重现的bug,将有很高的机会在下个版本中修复

最大的帮助,就是对bug报告中的问题有一个详细的描述,除此之外,就是能够给出一个很好的例子来说明你做了什么,导致了什么问题,并详细地描述问题的本身。所以最好的报告就是有一个完整的案例,来展示如何重现bug或问题。请参阅 28.5 节, “调试和移植MySQL”

请记住,报告中的信息包含的越多,就越容易得到我们的回应,我们最有可能对那些包含很多信息的报告做出回应,人往往会忽略一个事实,就是他们自己知道问题的原因,认为某些细节无关紧要, 。所以一个很好的原则就是,如果你对某个事情模棱两可,那就在您的报告中多写一些,这比花更多的时间等待回应更有快更好。万一我们还要求您必须提供第一份报告中遗漏的一些信息,那就更慢了。

bug报告中最常见的错误就是(a)没有包括您使用的MySQL发行版的版本号,(b) 没有完全描述MySQL服务器的运行平台(包括平台的类型和版本号) 。这些都是高度相关的信息。在100个报告案例中,99个没有它们。我们经常会遇见这样的问题, 为什么对我不起作用?,然后我们发现要么是请求的特性还没有在MySQL中实现,要么就是报告中描述的bug已经在新版的MySQL中修复。错误常常是与平台有关,在这种情况下, 在不了解操作系统平台和平台版本号的情况下,我们计划不可能修复任何地方。

如果您是源码编译安装的MySQL,如果问题与编译器相关,请记住,在报告中也一起提供编译器的信息。 用户经常在编译器中发现bug,于是就任务这个问题是与MySQL相关的,而事实就是,大部分的编译器还一直都处于开发阶段,并通过版本叠加不断的完善。所以为了确定您的bug是否和编译器有关,我们需要知道您使用的是什么编译器。 注意,每个编译器都应该视为bug并做相应的报告。

非常重要的一点就是,在报告中包含程序产生的错误如果程序产生错误。如果能在归档中搜到与程序产生的错误内容完全匹配就更好,(即使相似也应该多加留意)。别想着靠大脑记忆拼凑那些信息,最好将整个错误信息复制粘贴到报告中。

如果在连接器/ODBC (MyODBC)方面有问题,请生成一份跟踪文件,并将其与报告一起发送,参见 怎样反馈连接器/ODBC的问题或bugs

如果报告中测试案例中,含有一个在mysql命令行下很长查询输出,那么可以使用, --vertical 选项或 \G语句结束符来提高输出的可读性。在 EXPLAIN SELECT 的示例中会演示 \G的用法。

请在您的报告中包含一下信息:

  • 您使用的MySQL版本号(例如:MySQL 5.7.10)。可以通过执行 mysqladmin version找到版本号。 mysqladmin 程序位于MySQL安装目录的 bin目录下。

  • 问题出现的服务器硬件厂商和信号

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

  • 有时候也会与内存(物理和虚拟)的大小相关。如果不确定,也写上去。

  • 如果您使用的是MySQL软件的源码发布包,请将您使用的编译器名称和版本号写上。如果您有二进制发行包,请也写上发行包的名称。

  • 如果问题是在编译的过程中出现的,请写上准确的错误信息,以及出现错误的上下文。

  • 如果mysqld挂了,您应该报告引起 mysqld宕机的语句。 通常可以在运行mysqld时启用的查询日志记录中找到这些信息,然后在mysqld宕机之后查找日志。 参见28.5 节, “调试和移植 MySQL”

  • 如果问题和数据库表相关,那么报告中需要包含 SHOW CREATE TABLE db_name.tbl_name 语句输出的信息。这也是获取一个数据库中任何表的定义信息的最简单方法。这些信息可以帮助我们创建出与您相匹配的场景。

  • 当问题发生时,知道SQL模式也是非常重要,所以请把系统变量 sql_mode的值写到报告中。 对于存储过程、函数以及触发器这些对象,他们的sql_mode值是在被创建时开始生效。 SHOW CREATE PROCEDURESHOW 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 语句性能相关的bug或问题,您应该始终将 EXPLAIN SELECT ...的输出内容包含在报告中,并且还应该有几行SELECT输出记录。以及所有相关表的 SHOW CREATE TABLE tbl_name 输出信息。信息提供的越多,那么就越有利于别人帮助您。

    下面是一个非常好的bug反馈示例,这些语句都是使用mysql命令行工具下运行的。这里使用\G省略具体的语句内容,不然输出内容太多,导致阅读性差。

    mysql> SHOW VARIABLES;
    mysql> SHOW COLUMNS FROM ...\G
           <output from SHOW COLUMNS>
    mysql> EXPLAIN SELECT ...\G
           <output from EXPLAIN>
    mysql> FLUSH STATUS;
    mysql> SELECT ...;
           <A short version of the output from SELECT,
           including the time taken to run the query>
    mysql> SHOW STATUS;
           <output from SHOW STATUS>
    
  • 如果bug或问题是在运行 mysqld时出现的,尝试提供一个可以再次产生异常的脚本。此脚本应该包含任何必要的源文件,脚本越 接近您所遇见的情况越好,如果您可以提供一个重现场景的测试用例,您应该将其附属在报告中。

    如果您不能提供相关脚本,那么您至少应该在报告中包含 mysqladmin variables extended-status processlist的输出内容,以此提供一些关于您的系统如何执行的信息。

  • 如果您的测试用例较大,或者测试的表很大而不能直接包含在报告(超过10行)中,那么您应该将表mysqldump出来,并且添加一个 README 文件以便描述您的问题,然后使用 targzipzip制作成压缩文件。当您在 http://bugs.mysql.com/中为我们的bug库发起一个bug报告后,单击报告总的file选项,以便将压缩文件上传至bug库。

  • 如果您认为MySQL服务器在一个语句中产生了一个奇怪的结果,那么请将这个结果和您的看法和看法的解释包含在报告中。

  • 当您提供问题的示例时,最好是使用实际使用的表名,变量名,而不是重新取的名字。这个问题可能与这些表或变量的名字有关,虽然这样的案例很少,但还是要防患于未然。毕竟,您提供实际使用的示例对于我们解决问题会更有意义一些。 如果您的数据不想在bug报告中被其他人看见,那么您可以使用前面描述的文件选项卡来上传它,如果信息真的需要保密,并且您不想显示给我们看,请使用其他名称提供一个示例,这也是最后的选择了。

  • 如果可以的话,将相关程序的所有选项都包括在内。例如,在启动mysqld服务器时,以及用于运行任何MySQL客户端程序的选项时,都要指明所使用的选项。 对于像 mysqldmysql这样的程序,以及configure脚本,它们的选项通常是解决问题的关键,而且也是非常相关的,把它们包括在报告中百益而无一害。 如果您的问题涉及到Perl 或 PHP等编程语言的程序,请将语言处理器的版本号,以及程序使用的任何模块的版本包括在报告中。例如,假如您有一个Perl脚本,它使用 DBIDBD::mysql 模块,包括 Perl, DBI, 以及 DBD::mysql的版本号。

  • 如果您的问题和权限系统有关,请将mysqladmin reload的输出内容包括在报告中,以及连接时得到的所有报错信息。当您测试您的权限时 您应该执行mysqladmin reload version ,并尝试用产生问题的程序连接。

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

    如果我们不能确认该补丁的确切用途,我们将不会使用它。测试用例在这里帮助我们。显示该补丁可以处理可能发生的所有情况。假如我们发现一个边界情况(即使是一个罕见的情况),补丁不会起作用,那么它可能是无用的。

  • 猜测这是个什么bug,为什么会发生,或者它依赖什么。往往这样是错误的,即使是MySQL团队,也不能在没有先调试问题的情况下,来猜测真正是什么原因引起的bug。 things without first using a debugger to determine the real cause of a bug.

  • 请在您的bug报告中指出,您已经检查了参考手册和邮件归档,以便其他人知道您自己已经尝试过解决这个问题。

  • 如果您的数据已经损坏,或者您在访问特定的表时出现报错,那么首先使用CHECK TABLE检查您的表,如果该语句产生了任何错误:If

    • InnoDB的崩溃恢复机制会处理在服务器被杀死后重新启动的清理工作,因此在典型操作中不需要 repair 表。如果您遇到了 InnoDB 表错误,重启服务器,再看看问题是否依然存在,或者错误是否只是影响到内存中缓存的数据。 如果磁盘上的数据被损坏,那么就要考虑启用 innodb_force_recovery 选项,以便您可以转储受影响的表。

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

    如果您是运行在Windows平台上,请使用SHOW VARIABLES LIKE 'lower_case_table_names' 语句来验证 lower_case_table_names 的值。 这个变量影响着服务器如何处理数据库和表名的字母情况,对于给定值的影响如 9.2.2节, “标示符大小写敏感”中描述。

  • 如果您的表经常被损坏,您应该尝试找出什么时候以及为什么会发生这样的事情,在这种情况下,MySQL数据目录下的错误日志可能会包含一些当时情况出现的一些信息。 (这个文件是以 .err 为后缀的文件名。) 参阅5.4.2 节, “错误日志”。 请在您的bug报告中应该包含此文件中的所有信息。正常情况下,如果在更新过程中,没有任何东西杀死mysqld,那么mysqld是不会崩溃的。 如果你能找出导致mysqld死掉的原因,那么我们就更容易为您提供解决问题的方法。参见 B.5.1 节, “如果确定导致问题的原因”

  • 如果可能的话,下载并安装最新版本的MySQL服务器,检查它是否能解决您的问题。所有版本的MySQL软件都经过了彻底的测试, 并且应该在没有问题的情况下工作。我们相信所有的都是可以向后兼容的,而且您应该能够毫不费力地转换MySQL版本。参见 2.1.1 节, “安装那个版本的MySQL”

1.8 MySQL标准的兼容性

在本节中,介绍了MySQL与ANSI/ISO SQL 标注的关系。MySQL服务器有很多对SQL标准的扩展指出,这里介绍了它们是什么,以及使用它们的方法。您也能了解关于MySQL服务器缺失功能的信息,以及如何处理某些差异的方法。

SQL 标准自1986年以来在不断的演化和发展。已有数种版本。在手册中,SQL-92 指的是1992年发布的标准。 SQL:1999 指的是1999年发布的标准 SQL:2003 指的是2003年发布的标准 SQL:2008 指的是2008年发布的标准,也是现在的最新版,我们采用术语 SQL标准标准SQL一词来表示SQL标准的当前版本。

我们的主要目标之一,是在不牺牲速度和可靠性为代价的情况下,继续朝着符合MySQL标准的方向努力,没有良好理由的情况下,不限制MySQL服务器的可用性。如果它们能够显著的增加有用大量用户基数的MySQL服务器的可用性。 我们无惧于为SQL添加扩展,也无惧于为非SQL特性提供支持。 HANDLER接口就是本策略的例子。参见 13.2.4 节, “HANDLER 语法”.

我们将继续支持事务性和非事务性数据库,以满足关键任务的24/7全天候使用,以及高负载Web和日志应用。

MySQL服务器最初是为了小型计算机系统上中等规模的数据库(10-1亿行,或单表大约100MB)设计的。如今的MySQL服务器处理TB级别的数据库。

虽说MySQL复制特性提供了强大的功能,但是我们并未定位在实时支持。

MySQL 支持 ODBC 级别为 0 到 3.51。

MySQL支持使用 NDBCLUSTER 存储引擎来构建高可用性数据库集群。参见 MySQL NDB 集群 7.5 和 NDB 集群 7.6

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

MySQL支持由RFC 7159定义的本地JSON数据类型,且是基于ECMAScript标准(ECMA-262)。参见 11.6 节, “JSON 数据类型”。 MySQL还实现了SQL/json函数的子集,这些函数由SQL:2016标准的预发布草案指定的;更多信息,参见12.16 节, “JSON 函数”

选择 SQL 模式

MySQL服务器能够工作在不同的SQL模式下,并根据系统变量sql_mode的值 来对 不同的客户端应用这些模式,DBA可以通过设置全局的SQL模式来匹配站点服务器的操作需求,这样每个应用程序都可以根据自身的需求来设置SQL模式。

模式影响MySQL支持的SQL语法,它执行的数据验证。而这也使得MySQL可以更容易的在不同的环境中使用,还可以和其他数据库服务器一起使用。

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

在ANSI模式下运行MySQL

使用带有--ansi 选项的 mysqld 启动,就可以让MySQL以ANSI模式运行。在ANSI模式下运行服务器和使用下面的选项启动它效果是一样的:

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

执行下面两条语句,可以达到相同的效果:

SET GLOBAL TRANSACTION ISOLATION LEVEL SERIALIZABLE;
SET GLOBAL sql_mode = 'ANSI';

sql_mode变量的值设置为与'ANSI'模式相关的所有选项。 可以看到如下结果:

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

运行在带有--ansi 选项的ANSI模式下的MySQL,与将SQL模式设置为'ANSI'并不完全相同, 因为--ansi 选项也设置了事务的隔离级别。

参见  5.1.4 节, “服务器命令选项”

1.8.1 MySQL 对标准SQL的扩展

MySQL服务器包含一些其他SQL DBMS中不具备的扩展。单需要注意的是,如果使用了它们,那么将无法把代码移植到其他SQL服务器。 在某些情况下,您可以编写含MySQL扩展的代码,但是仍然想保留其移植性的方法是,使用下面的形式将其注释:

/*! MySQL-特殊代码 */

在这种情况下,MySQL服务器会像对待其他SQL语句一样解析并执行注释中的代码,但是其他SQL服务器将忽略 这些扩展。例如,MySQL服务器能识别下面语句中的STRAIGHT_JOIN 关键字,但是其他服务器就不能:

SELECT /*! STRAIGHT_JOIN */ col1 FROM table1,table2 WHERE ...

如果在!后面添加了版本号,仅当MySQL的版本等于或高于指定的版本号时,才会执行注释中的语法,下面语句中的 KEY_BLOCK_SIZE子句,只有在MySQL 5.1.10或更高版本中执行: or higher:

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

下面按类别列举各种MySQL扩展。

1.8.2 MySQL 与标准SQL的差异

我们试图使MySQL服务器遵从ANSI SQL标准和ODBC SQL标准,但在某些情况下MySQL服务器执行的操作有所不同:

1.8.2.1 SELECT INTO TABLE 差异

MySQL 服务器不支持 Sybase SQL的扩展 SELECT ... INTO TABLE, 但是MySQL支持标准SQL语法中的INSERT INTO ... SELECT,它们基本上是相同的,请参见 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 OUTFILECREATE TABLE ... SELECT

您可以在SELECT ... INTO中使用自定义变量,还可以在游标和局部变量的存储过程中使用相同的语法。  13.2.10.1 节, “SELECT ... INTO 语法”

1.8.2.2 UPDATE 差异

如果您通过访问表中的一列,以便在表达式中更新,那么UPDATE将使用该列的当前值。下面语句中的第二个复制,将 col2设置为当前col1(更新后的)的值,而不是使用原来的 col1值,所以最终的结果是 col2col1的值一样。这种行为与标准SQL不一样。

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

1.8.2.3 外键差异

MySQL在外键的实施与SQL标准不同之处在以下几点:

  • 如果父表中有多个具有相同应用键值,那么InnoDB会在外键中执行检查,并且就像其他具有相同键值的复航不存在一样。 例如,如果您定义了一个RESTRICT 类型约束, 并且一个子行带有多个父行,那么 InnoDB不允许删除任何父行。

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

  • 引用非唯一的外键约束不是标准的SQL,而是 InnoDB的一个扩展。

  • 如果在相同的级联中ON UPDATE CASCADEON UPDATE SET NULL 递归更新一个之前更新过的表,那么外键就充当约束的作用。 这就意味着您不能在ON UPDATE CASCADEON UPDATE SET NULL 运算中使用自引用。 这是为了防止由于级联更新而产生的无限循环。 另一方面,ON DELETE SET NULL可能自引用,就像一个自引用的ON DELETE CASCADE。级联操作 可能不会嵌套在超过15层的深度。

  • 在SQL语句中,插入、删除或更新多行,外键约束(如,唯一约束)都是逐行检查的。 在执行外键检查时,InnoDB会在必须检查的子或父行上,设置共享行级锁。 MySQL会立刻检查外键约束,而不是延迟到事务提交, 而根据SQL标准,检查这个行为应该是延迟的,就是说只有在处理完整个SQL语句之后,才会进行约束检查,这就意味着,不能删除被外键本身引用的行。

更多有关InnoDB 存储引擎如何处理外键的信息,请参见 15.8.1.6 节, “InnoDB 和 外键约束”

1.8.2.4 '--' 作为注释的开头

标准SQL中使用C中的语法 /* 这是注释 */ 做注释,MySQL服务器也支持这样的语法,同时MySQL还对这种语法进行了扩展,使得可以将MySQL特殊的SQL嵌入到注释中。 正如 9.6 节, “Comment 语法”中描述的。

标准 SQL 使用 -- 作为注释的开始 MySQL使用 #作为注释起始字符,MySQL同样支持-- 风格的注释。 但是要求,用--后面跟一个空格(或控制字符,如:新行) ,之所以这样要求,是为了防止自动生产SQL查询产生的问题,这些查询采用类似下面的构造,其中, 自动为payment插入支付值:

UPDATE account SET credit=credit-payment

考虑一下,如果payment 有一个负值,会发生什么?比如-1

UPDATE account SET credit=credit--1

在SQL中credit--1 是一个合法的表达式,但是 -- 被解析为注释开始,所以表达式的部分被丢弃,其结果是,表达式的一样与逾期的意义完全不同。

UPDATE account SET credit=credit

这条语句没有产生任何改变,这说明了允许注释以-- 开始,会产生严重的后果。

由于只有--后面跟随一个空格才会被MySQL服务器识别为一个注释行,因此 credit--1 可以放心使用。

另一个安全特性就是,mysql命令行客户端会忽略所有以 --开头的行。

1.8.3 MySQL 如何处理约束

MySQL 让您同时可以事务表和非事务表,因此,在MySQL中约束的您出会与其他RDBMS中有所不同。我们必须处理这样的情况,当在非事务性表中插入或更新了很多行,此时发生错误,所做的更改不能回滚。

基本的原理是,MySQL服务器会尽量将 在解析将要执行的语句的同时,MySQL服务器试图为它能检测到的任何东西产生一个错误信息,并试图从执行语句时发生的任何错误中恢复。在大多数情况下我们都是这样做的,但是不是所有的情况。

出现错误时,MySQL可选择中途中止语句,或尽可能恢复并继续执行语句。默认情况下,服务器将采取后一种路线。这意味着,服务器可能会强制将非法值变为最接近的合法值。

目前有数种SQL模式,它们能够对如何接受可能为不良数据值的方式进行更好的控制,也能在出现错误时,对是否继续执行语句或放弃语句进行控制。使用这些选项, 能够将MySQL服务器配置为更为传统的风格,就像其他的DBMS一样,拒绝不正确的输入。SQL模式可以在运行时设置,这使得每个客户端可以选择最合适其需求的行为。 请参见5.1.8 节, “服务器 SQL 模式”.

下面介绍MySQL服务器如何处理不同的约束

1.8.3.1 主键和唯一索引约束

通常情况下,当您试图INSERT或UPDATE会导致主键、唯一键或外键冲突的行时,将出现错误。如果您正在使用事务性存储引擎时,如InnoDB,MySQL会自动回滚语句。如果您正在使用非事务性存储引擎,MySQL将在出错的行上停止执行语句,剩余的行也不再处理。

如果,您使用MySQL为INSERTUPDATE等提供的提供的IGNORE 关键字, 那么MySQL会忽略主键或唯一键的冲突,并继续处理下一行。 请参见( 13.2.6 节, “INSERT 语法”,  13.2.12 节, “UPDATE 语法”, 等等)。

使用 mysql_info() C API 函数可以获取实际插入或更新行数的信息。 同样还可以使用 SHOW WARNINGS 语句,请参见27.7.7.36 节, “mysql_info()”, 和 13.7.5.40 节, “SHOW WARNINGS 语法”

目前,只有InnoDB 表支持外键。请参见 15.8.1.6 节, “InnoDB 和 外键约束”

1.8.3.2 外键约束

外键可以实现跨表交叉应用数据,同时外键约束有助于数据的一致性。

MySQL支持在CREATE TABLEALTER TABLE语句中ON UPDATEON DELETE 外键引用。可使用的引用有RESTRICT(默认的)、 CASCADE, SET NULL,和 NO ACTION

SET DEFAULT 同样被MySQL支持,但是在目前的 InnoDB中是视为无效。由于MySQL不支持延迟约束检查, 所以NO ACTION 被作为 RESTRICT。 对于MySQL外键支持发语法,请参阅 13.1.15.6 节, “使用FOREIGN KEY 约束”.

虽然MATCH FULL, MATCH PARTIAL, 和 MATCH SIMPLE 是允许使用, 但是应该尽量避免使用它们,因为在同样的语句中,它们会导致MySQL忽略语句中使用的任何ON DELETEON UPDATE 子句。 在MySQL中MATCH 选项没有任何效果,它的实际作用是强制MATCH SIMPLE 语义完全匹配。

如果您在建表的时候,在某个列上创建了外键约束,却没有建立索引,那么MySQL会自动为给定的列创建索引。因为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 rows in set (0.01 sec)

也可以从 INFORMATION_SCHEMA 库中的 INNODB_SYS_FOREIGNINNODB_SYS_FOREIGN_COLS 表来查看InnoDB 表的外键信息。

InnoDB表支持外键。 有关InnoDB外键的详细信息,请参见15.8.1.6 节, “InnoDB 和 FOREIGN KEY 约束”

1.8.3.3 无效数据的约束

默认情况下,MySQL对无效或不当值的处理比较宽泛,而且为了数据输入,会强制将其变为合法值。当然您可以启开严格SQL模式,来选择传统的不合法值处理方式,这样服务器就会拒绝它们,并中断出现不合法值的语句。请参见 5.1.8 节, “服务器SQL 模式”

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

如果您未使用严格SQL模式,不管什么时候您往一个列插入一个 不正确值,如:将空值插入非空列,或将过大的值数值插入一个数值列, MySQL会将这些列设置为 最可能值 ,而不是生成错误信息:以下规则详细描述这是如何工作的:

  • 如果您将一个超过范围的值保存到数值列,MySQL服务器将保存0,(最小的可能值,或最大的可能值)任何与无效值最接近的值。

  • 对于字符串,MySQL或保存空字符串,或将字符串尽可能多的保存到列中。

  • 如果您试图将不是以数字开头的字符串保存到数值列中,MySQL服务器将保存0。

  • 对于ENUMSET 列的无效值,将会按照1.8.3.4节, “ENUM 和 SET 约束”中描述的处理。

  • MySQL允许将特定的不正确日期值保存到DATEDATETIME列(如'2000-02-31''2000-02-00')。 其观点在于,验证日期不是SQL服务器的任务。如果MySQL能保存日期值并准确检索相同的值,MySQL就能按给定的值保存它。如果日期完全不正确(超出服务器能保存的范围) 那么这个特殊的日期值,将会用'0000-00-00'代替。

  • 如果试图将NULL保存到一个不接受NULL 值的列,对于单行操作的 INSERT 语句,会出现错误。对于多行操作 INSERT语句,或 INSERT INTO ... SELECT 语句,MySQL服务器会保存列数据类型的隐含默认值。一般情况下,对于数值类型的是0,对于字符串类型的是空字符('') ,对于日期类型的是 zero。隐含默认值的讨论在 11.7节, “数据类型默认值”

  • 如果一个INSERT 语句没有为该列指定任何值,如果列的定义包含了明确的 DEFAULT 子句,那么MySQL将插入默认值,如果列的定义中没有这样的DEFAULT子句。那么MySQL会插入列数据类型的隐含默认值。

在非严格模式下使用尚需规则的原因是,在语句开始执行之前,我们不能检查这些条件。所以在更新了几行之后遇到错误,我们不能仅靠回滚。这是因为存储引擎不能不支持回滚。 中止语句并不是好的选择,在这种情况下,更新完成了一半 ,这才是糟糕的情况。在这种情况下,最好是尽您所能,然后就像什么都未发生那样继续下去。

您可以使用 STRICT_TRANS_TABLESSTRICT_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 IGNOREUPDATE IGNORE来将错误当做告警, 而不是不带IGNOREINSERTUPDATE

1.8.3.4 枚举和集合约束

枚举集合 列提供了一种有效的方法来定义只包含一组给定值的列。参见 set of values. See  11.4.4 节, “枚举类型”, 和 11.4.5节, “集合类型”.

由于严格的启用了 (参见5.1.8 节, “服务器 SQL 模式”), ENUMSET列的定义就成为该列的值的约束。对于不满足此条件的值,就会报错:

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

  • A SET 值必须空字符,或一个仅由列定义中的值组成的值,对于一个被定义为 SET('a','b','c')的列,像 'd''a,b,c,d' 这样的值是无效的且被拒绝。

在严格模式下,如果您使用 INSERT IGNOREUPDATE IGNORE 那么无效值的错误会被抑制,此时不会产生一个错误,而是一个警告。 对于 ENUM类型, 该值将会当做错误的成员插入(0)。对于 SET类型, 只有给定的值才能插入,其他无效的字符串将会被剔除。例如:'a,x,b,y' 插入的结果是: 'a,b'

1.9 鸣谢

下面小节将列出开发者、贡献者以及支持着,是他们的帮助,才能成就MySQL的今天。

1.9.1 MySQL的贡献者

尽管MySQL 服务器MySQL 手册的所有版权在Oracle和其附属公司手上,我们仍然要感谢那些对 MySQL 分发做过贡献的人。下面随机列出一些贡献者:

  • Gianmassimo Vigazzola or

    最初写Win32/NT端口。

  • Per Eric Olsson

    对动态记录格式进行建设性的批评和真正的测试。

  • Irena Pancirov

    带有Borland编译器的Win32端口。 mysqlshutdown.exemysqlwatch.exe

  • David J. Hughes

    致力于创建一个共享的SQL数据。曾就职于At TcX, 是MySQL AB的前身。我们是以 mSQL为起点,但发现它满足不了我们的目的,所以我们给我们的应用程序构建器Unireg写了一个SQL接口。 mysqladminmysql 客户端在很大程度上受限于和他们对应的 mSQL,于是我们花了很多精力才使得MySQL语法成为mSQL 的超集,因为许多API的想法都是源自于 mSQL ,这样就可以方便自由的将 mSQL程序移植到MySQL API中。MySQL软件不再包含任何自来mSQL的代码。 发行版中的两个文件 (client/insert_test.cclient/select_test.c) 是基于相应的 mSQL 分支版(非版权)文件,但是他们已经被修改为示例,用来展示将mSQL代码转换为 MySQL服务器代码所必要的修改。(mSQL 的版权归 David J. Hughes所有。)

  • Patrick Lynch

    帮我们获得http://www.mysql.com/域名。

  • Fred Lindberg

    建立qmail来处理MySQL邮件列表,以及在管理MySQL邮件列表上给予我们巨大的帮助。

  • Igor Romanenko

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

  • Yuri Dario

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

  • Tim Bunce

    mysqlhotcopy的作者。

  • Zarko Mocnik

    为斯洛文尼亚语排序。

  • "TAMITO"

    _MB字符集和ujis以及sjis 字符集设置宏指令。

  • Joshua Chamas

    并发插入原型,日期的语法扩展,NT上的调试以及在MySQL邮件列表上的应答。

  • Yves Carlier

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

  • Rhys Jones (And GWE Technologies Limited)

    早期 JDBC 驱动者之一。

  • Dr Xiaokun Kelvin ZHU

    早期JDBC驱动者和进一步开发者之一,以及其他MySQL相关的java工具。

  • James Cooper

    在他的站点上建立了一个可搜索的邮件列表档案。

  • Rick Mehalick

    xmysql方面,一个MySQL的图形客户端

  • Doug Sisk

    为Red Hat Linux平台提供MySQL RPM包。

  • Diemand Alexander V.

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

  • Antoni Pamies Olive

    为Intel 和 SPARC 平台提供许多RPM版本的MySQL客户端。

  • Jay Bloodworth

    为MySQL 3.21提供RPM版本。

  • David Sacerdote

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

  • Wei-Jou Chen

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

  • Wei He

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

  • Jan Pazdziora

    捷克语的顺序排序。

  • Zeev Suraski

    FROM_UNIXTIME() 时间格式 ENCRYPT()函数, functions, and bison 顾问,一个活跃的邮件列表成员。

  • Luuk de Boer

    将基准套件移植(并扩展)到DBI/DBD。在crash-me和进行基准测试方面有巨大的帮助,一些日期函数,mysql_setpermission 脚本。

  • Alexis Mikhailov

    自定义函数(UDFs); CREATE FUNCTIONDROP FUNCTION

  • Andreas F. Bobak

    自定义函数的扩展AGGREGATE

  • Ross Wakelin

    帮助建立Win32下的MySQL安装向导

  • Jethro Wright III

    The libmysql.dll library.

  • James Pereria

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

  • Curt Sampson

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

  • Martin Ramsch

    MySQL教程的示例。

  • Steve Harvey

    使mysqlaccess更安全。

  • Konark IA-64 Centre of Persistent Systems Private Limited

    Help with the Win64 port of the MySQL server.

  • Albert Chin-A-Young.

    Configure updates for Tru64, large file support and better TCP wrappers support.

  • John Birrell

    Emulation of pthread_mutex() for OS/2.

  • Benjamin Pflugmann

    Extended MERGE tables to handle INSERTS. Active member on the MySQL mailing lists.

  • Jocelyn Fournier

    Excellent spotting and reporting innumerable bugs (especially in the MySQL 4.1 subquery code).

  • Marc Liyanage

    Maintaining the OS X packages and providing invaluable feedback on how to create OS X packages.

  • Robert Rutherford

    Providing invaluable information and feedback about the QNX port.

  • Previous developers of NDB Cluster

    Lots of people were involved in various ways summer students, master thesis students, employees. In total more than 100 people so too many to mention here. Notable name is Ataullah Dabaghi who up until 1999 contributed around a third of the code base. A special thanks also to developers of the AXE system which provided much of the architectural foundations for NDB Cluster with blocks, signals and crash tracing functionality. Also credit should be given to those who believed in the ideas enough to allocate of their budgets for its development from 1992 to present time.

  • Google Inc.

    We wish to recognize Google Inc. for contributions to the MySQL distribution: Mark Callaghan's SMP Performance patches and other patches.

Other contributors, bugfinders, and testers: James H. Thompson, Maurizio Menghini, Wojciech Tryc, Luca Berra, Zarko Mocnik, Wim Bonis, Elmar Haneke, , , , Ted Deppner , Mike Simons, Jaakko Hyvatti.

还有许多bug反馈/补丁来自邮件列表上的人。

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

1.9.2 文案和翻译者

下面这些人帮助我们编写MySQL文档以及对MySQL文档和错误信息进行翻译。

  • Paul DuBois

    正在帮助将本手册变得更确切和更易理解。众所周知的,这包含尝试用英文将Monty's和 David's的成果重写为英文。

  • Kim Aldale

    帮助将Monty's和 David's的早期成果重写为英文。

  • Michael J. Miller Jr.

    MySQL手册第一版本。许多FAQ的拼写/语言的修复(其实很久之前就形成了MySQL手册)。

  • Yan Cailin

    早在2000年初,第一个将MySQL参考手册翻译为简体中文版,并在此基础之上,编写了Big5和港文版本。

  • Jay Flaherty

    本手册中DBI/DBD节的大部分。

  • Paul Southworth , Ray Loyzaga

    参考手册的校对。

  • Therrien Gilbert , Jean-Marc Pouyot

    法语版错误信息。

  • Petr Snajdr,

    捷克语版错误信息。

  • Jaroslaw Lewandowski

    波兰语版。

  • Miguel Angel Fernandez Roiz

    西班牙语版。

  • Roy-Magne Mo

    挪威语版错误信息和MySQL 3.21.XX的测试工作。

  • Timur I. Bakeyev

    俄语版错误信息。

  • & Filippo Grassilli

    意大利版错误信息。

  • Dirk Munzinger

    德语版错误信息。

  • Billik Stefan

    斯洛伐克语版错误信息。

  • Stefan Saroiu

    罗马西亚语版错误信息。

  • Peter Feher

    匈牙利语版错误信息。

  • Roberto M. Serqueira

    葡萄牙语版错误信息。

  • Carsten H. Pedersen

    丹麦语版错误信息。

  • Arjen Lentz

    荷兰语版错误信息。完成翻译的早期部分(仍然影响着后期版本的一致性和拼写)。

1.9.3 支持MySQL的包

下面列举一些被很多人和MySQL一起使用的,且最重要的一些API/包/应用程序的创造者和维护者。

我们不能列出所有可能的软件包,因为这个列表将会变得很难维护。对于其他包,请参考软件门户网站 http://solutions.mysql.com/software/

  • Tim Bunce, Alligator Descartes

    DBD (Perl) 接口上。

  • Andreas Koenig

    在MySQL的 Perl 接口上。

  • Jochen Wiedmann

    Perl DBD::mysql 模块的维护。

  • Eugene Chan

    在MySQL的PHP接口上。

  • Georg Richter

    在MySQL 4.1 版本的测试和bug查找,以及MySQL 4.1中mysqli(API)的扩展,被用在新版PHP 5.0及更高版本中。

  • Giovanni Maruzzelli

    在iODBC (Unix ODBC)移植上。

  • Xavier Leroy

    LinuxThreads的作者 (被用于Linux平台下的MySQL)。

1.9.4 用于创建MySQL的工具

下面列举一些我们用来创建MySQL的工具列表,以此表达我们对那些创造它们的人的感谢。没有这些工具,我们也不能有今天的MySQL。

  • 自由软件基金会

    从那里我们得到了以优秀的编辑器 (gcc), 一个优秀的调试器 (gdblibc 库 (从那里我们还借用了 strto.c 来获得一些Linux中的代码)。

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

    拥有非常棒的编辑器/环境。

  • Julian Seward

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

  • Dorothea Lütkehaus 和 Andreas Zeller

    DDD (数据显示调试器---一个优秀的gdb图形前端)。 gdb)上。

1.9.5 MySQL的支持

尽管MySQL 服务器MySQL 手册的所有版权在Oracle和其附属公司手上,我们仍然要感谢以下公司在 MySQL 服务器发展建设上资金帮助融资,例如,支付我们开发新功能所需的费用,或者给我们开发 MySQL server所需的硬件设备。

  • VA Linux / Andover.net

    资助代表

  • NuSphere

    MySQL 手册的编辑

  • Stork Design studio

    1998-2000期间MySQL web站点

  • Intel

    在 Windows 和 Linux 平台的开发贡献.

  • Compaq

    在Linux/Alpha平台的开发共享

  • SWSoft

    mysqld 的嵌入式开发.

  • FutureQuest

    --skip-show-database 选项。