这是MySQL参考手册;它记载了MySQL版本3.23.7-alpha。
MySQL 是一个快速、多线程、多用户和强壮的SQL数据库服务器。
对Unix和 OS/2 平台,MySQL基本上是免费的;但对微软平台,你在30 天的试用期后必须获得一个MySQL 许可证。详见第三节 MySQL许可证和技术支持。
MySQL 主页提供有关MySQL的最新信息。
对于MySQL能力的讨论,详见1.4 MySQL 的主要特征。
对于安装指南,见4 安装 MySQL。对于有关移植MySQL到新机器或操作系统的技巧,参见G 对移植到其他系统的说明。
有关从 3.21 版升级的信息,详见4.16.2 从一个 3.21 版本升级到 3.22 。
MySQL的入门教程,见8 MySQL 教程。
SQL和基准信息的例子,见基准目录(在分发中的'sql-bench'目录)。
对于新特征和错误修复一个历史记录,见D MySQL的变迁。
对于当前已知错误和功能缺陷的一张列表,见E MySQL已知错误和设计缺陷。
未来计划,见F 我们想要在未来加入到MySQL 的计划表( TODO )。
这个计划的所有贡献者的名单,见C MySQL 的贡献者。
重要:
将臭虫(错误)报告、问提和建议发到邮件列表(原文未提供)。
对源代码分发,mysqlbug
脚本可在‘scripts’目录下找到。
对二进制的分发,mysqlbug
可在‘bin’目录下找到。
如果你有任何关于这本手册的增补或修正的任何建议,请将它们发给手册小组([email protected] )。
MySQL是一个真正的多用户、多线程SQL数据库服务器。SQL(结构化查询语言)是世界上最流行的和标准化的数据库语言。MySQL是以一个客户机/服务器结构的实现,它由一个服务器守护程序mysqld
和很多不同的客户程序和库组成。
SQL是一种标准化的语言,它使得存储、更新和存取信息更容易。例如,你能用SQL语言为一个网站检索产品信息及存储顾客信息,同时MySQL也足够快和灵活以允许你存储记录文件和图像。
MySQL 主要目标是快速、健壮和易用。最初是因为我们需要这样一个SQL服务器,它能处理与任何可不昂贵硬件平台上提供数据库的厂家在一个数量级上的大型数据库,但速度更快,MySQL就开发出来。自1996年以来,我们一直都在使用MySQL,其环境有超过 40 个数据库,包含 10,000个表,其中500多个表超过7百万行,这大约有100 个吉字节(GB)的关键应用数据。
MySQL建立的基础是业已用在高要求的生产环境多年的一套实用例程。尽管MySQL仍在开发中,但它已经提供一个丰富和极其有用的功能集。
MySQL的官方发音是“My Ess Que Ell”(不是 MY-SEQUEL )。
目前这本手册有Texinfo、普通文本、Info、HTML、PostScript和 PDF 等格式的版本。因为它们的长度,PostScript和 PDF 版本没有包括在主要的MySQL分发中,但是可从http://www.mysql.com 获得单独的下载。
主要的文档是Texinfo文件, HTML版本自动地用一个texi2html
改进版本生成。普通文本和Info版本用makeinfo
生成。
Postscript版本由texi2dvi
和dvips
生成。PDF 版本用pdftex
生成。
本手册由David Axmark, Michael (Monty) Widenius, Paul DuBois and Kim Aldale维护。 而其他的贡献者,见C MySQL贡献者。
这本手册使用了一定文字格式的约定:
constant / 固定宽度
mysqladmin
如何工作,用--help
选项调用它”。当命令显示出准备由一个特定的程序执行时,程序由命令所显示的提示符指出。例如,shell>
表明你从你的登录外壳执行一个命令,而mysql>
表明你从mysql
客户执行命令:
shell> 在这键入一个shell命令 mysql> 在这里键入一个mysql命令
shell命令用 Bourne shell语法显示。如果你正在使用csh
风格的外壳,你可能需要用略微不同的方式发出命令。例如,设置一个环境变量和运行一个命令的序列在 Bourne shell语法看起来像这样:
shell> VARNAME=value some_command
对于csh
,你将执行这样的序列:
shell> setenv VARNAME value shell> some_command
数据库、表和列名字经常必须被代入命令中。为表明这种代入是必要的,本手册使用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语句可以写成大写或小写的。当本手册显示SQL语句时,如果讨论这些关键字,大写被用于特定的关键字(强调它们)而小写被用于语句的其他部分。因此你可能在讨论SELECT语句时看到如下显示:
mysql> SELECT count(*) FROM tbl_name;
另一方面,在讨论COUNT()
函数时,语句将写成这样:
mysql> select COUNT(*) from tbl_name;
如果不有意地特别强调,所有的关键字一律写成大写。
在句法描述中,方括号('['和']')被用来表示任选的词或子句:
DROP TABLE [IF EXISTS] tbl_name
当一个语法元素由很多选择组成时,各选择用垂直线分开('|')。当可能从一组选择中选择一个成员时,选择在方括号内被列出。当必须从一组选择中选择一个成员时,选择在花括号内被列出('{'和'}'):
TRIM([[BOTH | LEADING | TRAILING] [remstr] FROM] str) {DESCRIBE | DESC} tbl_name {col_name | wild}
我们曾经开始打算利用mSQL
用我们自己的快速底层(ISAM)实用程序连接我们的数据库表,然而,在一些测试以后我们得到出结论:mSQL
对我们的需求来说不够快速和灵活。这导致了一个连接我们数据库的新SQL接口,但它几乎有与mSQL
相同的应用编程接口。选择这个应用编程接口以方便第三方的代码移植。
MySQL名字的由来不是非常清楚。我们的基目录和很多的库和工具具有前缀“my”已超过10年历史,然而,Monty的女儿(年轻几岁的)也被命名"my"。因此其中哪一个原因给MySQL起了这个名字仍然是一个谜,甚至对我们。
下表描述MySQL一些重要的特征:
FLOAT
、DOUBLE
、CHAR
、VARCHAR
、TEXT
、BLOB
、DATE
、TIME
、DATETIME、
TIMESTAMP
、YEAR
、SET
和ENUM
类型。
见7.3 列类型。 SELECT
和WHERE部分
支持全部运算符和函数,例如:mysql> SELECT CONCAT(first_name, " ", last_name) FROM tbl_name WHERE income/dependents > 10000 AND age > 30;
GROUP BY
和ORDER BY
子句,支持聚合函数(
COUNT()
、COUNT(DISTINCT)
、AVG()
、STD()
、SUM()
、
MAX()
和MIN()
)。LEFT OUTER JOIN
和ODBC语法。
CHAR
或VARCHAR
字段的前缀。INSERT
插入一个表列的子集,那些没用明确给定值的列设置为他们的缺省值。libtool。
purify
)。myisamchk
,一个检查、优化和修复数据库表的快速实用程序,详见13 维护 MySQL安装。 DELETE
、INSERT
、REPLACE
和UPDATE
返回有多少行被改变(受影响)。ABS
是一个有效的列名字。对函数调用的唯一限制是函数名与随后的“(”不能有空格。详见7.31 MySQL对保留字很挑剔吗?。 --help
或-?
获得联机帮助。SHOW
命令可用来检索数据库、表和索引的信息,EXPLAIN
命令可用来确定优化器如何解决一个查询。
本小节回答这样的问题:“MySQL的稳定程度?”和 “我能在本项目中依赖MySQL吗?”。这里我们将试图澄清一些问题并且回答似乎很多人关心的更重要的问题。本节已经与从邮件列表(它在报导错误是很活跃的)收集了的信息综合在一起。
对TcX,MySQL在我们自1996中期开始的计划中运行没有发生任何问题。当MySQL被更公开地发布时,我们注意到了有一些 “未测试代码”片断很快地被不同于我们的查询方式的新用户发现。每个新版本比前一个都有更少的可移植性问题(尽管每个发行有许多新功能),并且我们希望有可能把下一个版本之一标记为“稳定”的。
每个MySQL的发行都是可用的,并且只有当用户使用从“灰色地带”来的代码时才有问题,当然,不知情的用户不能知道灰色地带是什么;本小节尝试揭示我们目前已知的东西。这里的描述涉及MySQL 3. 22.x 版本。所有已知和报告的错误都会在最新的版本被更正,除了在错误小节中列出的与“设计n”有关的错误。详见E MySQL已知的错误和设计缺陷。
MySQL以多层结构和不同的独立模块编写,这些模块列举在下面以表明它们中的每一个是如何很好地被测试过:
mysql
、mysqladmin
和mysqlshow
、mysqldump
及mysqlimport
。
fcntl()
)有很大问题,在这些情况下,你应该用选项--skip-locking
运行MySQL守护程序。当使用NFS挂载的文件系统,已知在一些 Linux 系统上和SunOS上出现问题。fcntl()
调用,它通过使用mysqld
的--skip-locking
选项解决。一些人已经报告了0.5版中的锁定问题。的SELECT
语句通常在一个时帧内完成,因此不应该有一个mutex 锁定/线程的把戏。LOAD DATA ...
,INSERT ... SELECT
--稳定ALTER TABLE
--稳定mysqlaccess
--稳定GRANT
-- Gamma TcX 为付费客户提供电子邮件的支持,但是MySQL邮件列表通常提供常见问题的答案,错误通常马上用一个补丁修补,对严重的错误,几乎总是有新的版本发行。
MySQL本身己没有2000年有问题( Y2K ):
2069
年前没有日期问题,
所有2位年份被认为在1970
年到2069
年的范围,这意味着如果在一个year
类型的列中存储的01,MySQL把它当作2001
。
YEAR
类型的列能在一个字节中存储0年和1901年
到2155年
,并用使用2或4位显示它们。你可以用一种不是Y2K-safe的方式使用 MySQL应用程序来深入该问题。例如,许多老的应用程序使用2位数字(它有二义性)而非4位数字存储或操作年份,这个问题可能与使用诸如00
或99
作为“丢失的”值的提示的应用程序混淆起来。
很不幸,这些问题可能很难修复,因为不同的应用程序可能由不同程序员编写,其中每一个可能使用了不同的约定和日期处理函数。
这里是简单的示范,显示MySQL在 2030 年之前没有任何日期问题。
mysql> DROP TABLE IF EXISTS y2k; mysql> CREATE TABLE y2k (date date, date_time datetime, time_stamp timestamp); mysql> INSERT INTO y2k VALUES ("1998-12-31","1998-12-31 23:59:59",19981231235959); mysql> INSERT INTO y2k VALUES ("1999-01-01","1999-01-01 00:00:00",19990101000000); mysql> INSERT INTO y2k VALUES ("1999-09-09","1999-09-09 23:59:59",19990909235959); mysql> INSERT INTO y2k VALUES ("2000-01-01","2000-01-01 00:00:00",20000101000000); mysql> INSERT INTO y2k VALUES ("2000-02-28","2000-02-28 00:00:00",20000228000000); mysql> INSERT INTO y2k VALUES ("2000-02-29","2000-02-29 00:00:00",20000229000000); mysql> INSERT INTO y2k VALUES ("2000-03-01","2000-03-01 00:00:00",20000301000000); mysql> INSERT INTO y2k VALUES ("2000-12-31","2000-12-31 23:59:59",20001231235959); mysql> INSERT INTO y2k VALUES ("2001-01-01","2001-01-01 00:00:00",20010101000000); mysql> INSERT INTO y2k VALUES ("2004-12-31","2004-12-31 23:59:59",20041231235959); mysql> INSERT INTO y2k VALUES ("2005-01-01","2005-01-01 00:00:00",20050101000000); mysql> INSERT INTO y2k VALUES ("2030-01-01","2030-01-01 00:00:00",20300101000000); mysql> INSERT INTO y2k VALUES ("2050-01-01","2050-01-01 00:00:00",20500101000000); mysql> SELECT * FROM y2k; +------------+---------------------+----------------+ | date | date_time | time_stamp | +------------+---------------------+----------------+ | 1998-12-31 | 1998-12-31 23:59:59 | 19981231235959 | | 1999-01-01 | 1999-01-01 00:00:00 | 19990101000000 | | 1999-09-09 | 1999-09-09 23:59:59 | 19990909235959 | | 2000-01-01 | 2000-01-01 00:00:00 | 20000101000000 | | 2000-02-28 | 2000-02-28 00:00:00 | 20000228000000 | | 2000-02-29 | 2000-02-29 00:00:00 | 20000229000000 | | 2000-03-01 | 2000-03-01 00:00:00 | 20000301000000 | | 2000-12-31 | 2000-12-31 23:59:59 | 20001231235959 | | 2001-01-01 | 2001-01-01 00:00:00 | 20010101000000 | | 2004-12-31 | 2004-12-31 23:59:59 | 20041231235959 | | 2005-01-01 | 2005-01-01 00:00:00 | 20050101000000 | | 2030-01-01 | 2030-01-01 00:00:00 | 20300101000000 | | 2050-01-01 | 2050-01-01 00:00:00 | 00000000000000 | +------------+---------------------+----------------+ 13 rows in set (0.00 sec)
这表示DATE
和DATETIME
类型将不会有未来日期的任何问题(它们处理日期到 9999 )。
TIMESTAMP
类型被用来存储当前时间,有一个仅2030-01-01
的上限。TIMESTAMP
在32位的机器上(有符号值)有一个从1970
到2030
的范围,在64位机器上它处理时间可达2106
(无符号值)。
尽管MySQL是顺应Y2K的,但提供无二义性的输入是你的责任。对于MySQL处理二义性日期的输入(包含2位数字年份)的规则,详见7.3.6.1 Y2K 问题和日期类型。
在MySQL邮件列表上,这本书被多人推荐:
Judith S. Bowman, Sandra L. Emerson and Marcy Darnovsky The Practical SQL Handbook: Using Structured Query Language Second Edition Addison-Wesley ISBN 0-201-62623-3 http://www.awl.com
这本书也接受了 MySQL 用户的一些建议:
Martin Gruber Understanding SQL ISBN 0-89588-644-8 Publisher Sybex 510 523 8233 Alameda, CA USA
一本SQL语言教程可在 http://www.geocities.com/SiliconValley/Vista/2207/sql1.html 找到。
SQL in 21 Tagen (用德语写的网上书籍) http://www.mut.de/leseecke/buecher/sql/inhalt.htm 。
MySQL
mSQL
mSQL
TCL 补丁 DBI
/DBD
.
DBI
/DBD
modules homepage 也有很多网页使用 MySQL。详见A 一些 MySQL 用户。将任何新增发送到这张表中,并在某处加上 MySQL 标识(在一个“使用工具”的页面或类似的地方)。