mysql-logo.gif (3082 bytes)MySQL中文参考手册

译者:晏子 ([email protected])      主页:http://linuxdb.yeah.net


到第一节,前一节,下一节, 最后一节, 目录.


1 MySQL 的一般信息

这是MySQL参考手册;它记录MySQL版本3.23.6-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] )。

1.1 什么是 MySQL?

MySQL是一个真正的多用户、多线程SQL数据库服务器。SQL(结构化查询语言)是世界上最流行的和标准化的数据库语言。MySQL是由一个客户机/服务器结构的实现,它由一个服务器守护程序mysqld和很多不同的客户程序和库组成。

SQL是一种标准化的语言,它使得存储、更新和存取信息更容易。例如,你能SQL语言为一个网站检索产品信息及存储顾客信息。同时MySQL足够快速和灵活以便允许你存储记录文件和图像。

MySQL 主要目标是快速、健壮和易用。最早是因为我们需要这样一个SQL服务器,它能处理任何能提供不昂贵硬件平台上的数据库厂家的一个数量级上的大数据库,但速度更快,MySQL被开发出来。自从 1996 年以来,我们一直都在使用MySQL,其环境是有超过 40 个数据库,包含 10,000个表,其中超过500个表超过7 百万行,这大约有100 个吉字节的关键应用数据。

MySQL建立的基础是业已用在高要求的生产环境多年的一套实用例程。尽管MySQL仍在开发中,它已经提供一个丰富和极其有用的功能集。

MySQL的官方发音是“My Ess Que Ell”(不是 MY-SEQUEL )。

1.2 关于这本手册

目前这本手册可以得到 Texinfo、普通文本、Info、HTML、PostScript和 PDF 等格式的版本。因为它们的长度,PostScript和 PDF 版本没被包括在主要的MySQL发行版本中,但是可从http://www.mysql.com 得到单独的下载。

主要的文档是Texinfo文件, HTML 版本自动地用一个texi2html修改版本生成。普通文本和Info版本用makeinfo生成。 Postscript版本由texi2dvidvips生成。 PDF 版本用pdftex生成。

这本手册由David Axmark, Michael (Monty) Widenius, Paul DuBois and Kim Aldale维护。 而其他的贡献者,见C MySQL贡献者

1.2.1 习惯在这本手册使用的约定

这本手册使用了一定文字格式的约定:

constant / 固定宽度
固定宽度字体用于命令名字和选择、SQL语句、数据库、表和列命名、C 和 Perl 代码、环境变量。例如:“为了了解mysqladmin 如何工作,用与--help选项调用它”。
'文件名'
有包围引号的固定宽度字体用于文件名和路径。例如:“发行版本被安装在下面'/usr/local/'目录”。
'c'
有包围引号的固定宽度字体也常用于显示字符序列。例如:“指定一个通配符,使用'%' 字符”。
斜体
斜体的字体被用于强调,like this
粗体 
粗体用于存取权限名字(例如,“不轻易授权process权限”)并表达特别强调

当命令被显示准备被一个特定的程序执行时,程序由命令所显示的提示指出。例如,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_nametbl_namecol_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}

1.3 MySQL 的历史

我们曾经开始打算利用mSQL用我们自己的快速底层(ISAM)实用程序联接我们的数据库表,然而,在一些测试以后我们得到出结论mSQL对我们的需求来说不够快速和灵活。这导致了一个联接我们数据库的新的SQL接口,但它是与几乎有与mSQL相同的应用程序接口。选择这个应用程序接口以方便第三方的代码移植。

MySQL名字的由来不是非常清楚。我们的基本目录和很多我们的图书馆和工具有前缀“my”超过 10 年历史,然而, Monty 的女儿(年轻几岁的)也被命名"my"。因此其中哪一个原因把它的名字给了MySQL 仍然是一个谜,甚至对我们来说。

1.4 MySQL 的主要特征

下表描述MySQL一些重要的特征:

 

1.5 MySQL的稳定性?

本小节回答这样的问题:“MySQL的稳定程度?”和 “我能在本项目中依靠MySQL吗?” 。这里我们将试图澄清一些问题并且回答似乎很多人关心的更重要的问题。本节已经与从邮寄表(它在报导错误是很活跃的)收集了的信息综合在一起。

对TcX,MySQL在我们自1996中期开始的的计划中运行发生任何问题工作。当MySQL被更公开地发布时,我们注意到了有“一些 untested 代码”很快地被以不同于我们的查询方式的新用户发现。每个新发行比前一个都有更少的可移植性问题(尽管每个发行有许多新特征),并且我们希望有可能把下一个版本之一标记为“稳定”的。

每个MySQL的发行是可用的,并且只有当用户使用从“灰色地带”来的代码时才有问题,当然,不知情的用户不能知道灰色地带是什么;本小节尝试揭示我们目前已知的那些。这里的描述解决3. 22.x 版本MySQL。所有已知和报告的缺陷都在最新的版本被更正,除了在缺陷小节中列出的与“-design”有关的缺陷。详见E MySQL已知的错误和设计缺陷

MySQL以多层结构和不同的独立模块编写,这些模块列举在下面表明它们中的每一个是如何很好地被测试:

ISAM表处理器--稳定
它管理所有在MySQL 3.22和早期版本中的数据的存储和检索。在所有MySQL版本中,代码中始终没有一个单独(报告的)缺陷。得到一个破坏了的数据库表的唯一已知方法是在一个更新中途杀死服务器,即使这样也不大可能破坏任何数据而不能抢救,因为所有数据在每个查询之间被倒入(flush)到磁盘。而且从来没有有关由于MySQL缺陷而丢失数据的单独缺陷报告。
MyISAM 表处理器-- Beta 
这是 MySQL 3.23的新特征,它大部分是基于ISAM表编码但是有很多新的很有用的特征。
语法处理器和词法分析器 --稳定
很长时间在这个系统中没有一个单独报导的错误。
C 客户代码--稳定
没有知道的问题。在早期的 3. 20版本中,在发送/接收缓冲器大小上有一些限制。 3.21.x后,现在缓冲器大小是动态的,可到一个24M的缺省值。
标准客户程序--稳定
这些包括mysqlmysqladminmysqlshowmysqldumpmysqlimport
基本结构式查询语言--稳定
The basic SQL function system and string classes and dynamic memory handling. Not a single reported bug in this system. / 基本SQL函数系统、字符串类和动态内存处理,本系统中未见单独报告的错误。
查询优化程序--稳定
 
范围优化程序-- Gamma 
 
Join优化程序--稳定
 
锁定-- Gamma 
这是非常依赖于系统,在某些系统上用标准的操作系统锁定(fcntl())有很大问题, 在这些情况中,你应该用选项--skip-locking运行MySQL守护程序。当使用NFS挂载的文件系统,已知在一些 Linux 系统上和SunOS上发生问题。
Linux 线程-- Gamma 
唯一发现的问题fcntl()调用, 它通过使用mysqld--skip-locking选项解决。一些人已经报告了0.5版的lockup 问题。
Solaris 2.5 + pthreads --稳定
我们在我们的生产工作中使用。
MIT-pthreads (其他系统)-- Gamma 
自从 3.20.15版 没有报告的错误,而且从3.20.16开始没有已知的错误。在一些系统上,在一些操作是相当慢时(在每查询之间 1/20秒的睡眠 )有一个“功能失效”。当然, MIT-pthreads 可能使任何事情慢一点,但是基于索引的SELECT语句通常在一个时间帧内完成,因此不应该有一个mutex 锁定/线程的把戏。
其他线程实现 -- Alpha - Beta 
移植到其他系统仍然是很新的并且可以有错误,可能在MySQL中,但是最经常在线程实现本身。
LOAD DATA ... ,INSERT ... SELECT --稳定
一些人已经认为他们在这里发现了错误,但是这些通常是误解。请在报告问题前检查手册!
ALTER TABLE --稳定
在 3.22.12 的小的改变。
DBD --稳定
现在由 Jochen  Wiedmann 维护了。
mysqlaccess --稳定
由 Yves  Carlier 编写并维护。
GRANT -- Gamma 
MySQL 3.22.12.做了很大改变。
MyODBC (使用 ODBC  SDK 2.5 )-- Gamma 
它与一些程序似乎工作很好。

TcX 为付费客户提供电子邮件的支持,但是MySQL邮寄表通常提供常见问题的答案,错误通常马上用一个补丁修补,对严重的错误,几乎总是有新的版本发行。

1.6 顺应2000年(Year 2000 compliance)

MySQL本身己没有2000年有问题( Y2K ):

你可以以一种不是Y2K-safe的方式使用 MySQL应用程序来深入该问题。在一个方法那不是Y2K安全的.例如,许多老的应用程序存储或操作使用2位数字年份(它有二义性)而非4位数字,这个问题可以是由使用诸如0099作为“丢失的”数字表现的应用程序来合成。

很不幸,这些问题可能很难的修复,因为不同的应用程序可以有不同的程序员编写,其中每一个可以使用不同的约定和日期处理函数。

这里是简单的示范,显示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)

这表示DATEDATETIME类型是将不会有未来日期的任何问题(它们处理日期到 9999 )。

TIMESTAMP类型被用来存储当前的时间,有一个最大范围仅仅2030-01-01TIMESTAMP在32位的机器上(有符号值)有一个从19702030的范围,在64位机器上它处理时间可达2106(无符号值)。

尽管MySQL是顺应Y2K的,但提供无二义性的输入是你的责任。对于MySQL处理二义性的日期输入数据(包含2位数字年份)的规则,详见7.3.6.1 Y2K 问题和日期类型

1.7一般的结构式查询语言信息和教程

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 。

1.8 有用的MySQL相关链接

1.8.1 教程

1.8.2 Perl相关链接

1.8.3 MySQL 讨论论坛

1.8.4 支持 MySQL 的商业应用

1.8.5 SQL客户程序

1.8.6 支持MySQL的Web 开发工具

1.8.7 用 MySQL 支持的数据库设计工具

1.8.8 使用MySQL工具的Web服务器

1.8.9 对其他程序的扩充

1.8.10 通过其他程序使用MySQL

1.8.11 ODBC有关的链接

1.8.12 API有关的链接

1.8.13 其它MySQLx有关的链接

1.8.14 SQL和数据库接口

 1.8.15 使用MySQL的例子

 1.8.16 一般的数据库链接

也有很多网页使用 MySQL。详见A  一些 MySQL 用户。将任何添加发送到这张表中,并在某处加上 MySQL 标识(在“一个使用的工具”页或类似的东西)。


到第一节,前一节,下一节, 最后一节, 目录.


译者:晏子  [email:[email protected] 主页:http://clyan.soim.net]