当前位置:Linux教程 - Mysql - MySQL中文参考手册(MySQL的一般信息)

MySQL中文参考手册(MySQL的一般信息)



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

    1 MySQL 的一般信息
    这是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] )。


    1.1 什么是 MySQL?
    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 )。


    1.2 关于本手册
    目前这本手册有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贡献者。

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

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

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

    使用核心线程的完全多线程。这意味着它能很容易地利用多CPU(如果有)。
    C 、C++、 Eiffel 、 Java、 Perl、 PHP、Python、和 TCL API。见20 MySQL 客户工具和 API。
    可运行在不同的平台上,见4.2 MySQL支持的操作系统。
    多种列类型:1、 2、 3、4、和 8 字节长度的有符号/无符号整数、FLOAT、DOUBLE、CHAR、VARCHAR、TEXT、BLOB、DATE、TIME、DATETIME、 TIMESTAMP、YEAR、SET和ENUM类型。 见7.3 列类型。
    利用一个优化的一遍扫描多重联结(one-sweep multi-join)非常快速地进行联结(join)。
    在查询的SELECT和WHERE部分支持全部运算符和函数,例如:
    mysql> SELECT CONCAT(first_name, \" \", last_name) FROM tbl_name
    WHERE income/dependents > 10000 AND age > 30;
    通过一个高度优化的类库实现SQL函数库并且像他们能达到的一样快速,通常在查询初始化后不应该有任何内存分配。
    全面支持SQL的GROUP BY和ORDER BY子句,支持聚合函数( COUNT()、COUNT(DISTINCT)、AVG()、STD()、SUM()、 MAX()和MIN() )。
    支持ANSI SQL的LEFT OUTER JOIN和ODBC语法。
    你可以在同一查询中混用来自不同数据库的表。(与版本 3.22一样 )。
    一个非常灵活且安全的权限和口令系统,并且它允许基于主机的认证。口令是安全的,因为当与一个服务器连接时,所有的口令传送被加密。
    ODBC for Windiws 95。所有的 ODBC 2 . 5 函数和其他许多函数。例如,你可以用Access连接你的 MySQL服务器。见16 MySQL ODBC 支持。
    具备索引压缩的快速B树磁盘表。
    每个表允许有16个索引。每个索引可以由1~16个列或列的一部分组成。最大索引长度是 256 个字节(在编译MySQL时,它可以改变)。一个索引可以使用一个CHAR或VARCHAR字段的前缀。
    定长和变长记录。
    用作临时表的内存散列表。
    大数据库处理。我们正在对某些包含 50,000,000 个记录的数据库使用MySQL。
    所有列都有缺省值,你可以用INSERT插入一个表列的子集,那些没用明确给定值的列设置为他们的缺省值。
    为了可移植性使用 GNU Automake , Autoconf 和libtool。
    用C和C++编写,并用大量不同的编译器测试。
    一个非常快速的基于线程的内存分配系统。
    没有内存漏洞。用一个商用内存漏洞监测程序测试过(purify)。
    包括myisamchk,一个检查、优化和修复数据库表的快速实用程序,详见13 维护 MySQL安装。
    全面支持ISO-8859-1 Latin1 字符集。例如,斯堪的纳维亚的字符 @ringaccent{a}, @\"a and @\"o 在表和列名字被允许。
    所有数据以 ISO-8859-1 Latin1 格式保存。所有正常的字符串比较是忽略大小写的。
    根据 ISO-8859-1 Latin1 字符集进行排序(目前瑞典语的方式)。通过在源代码中增加排序顺序数组可以改变它。为了理解一个更高级的排序例子,看一看捷克语的排序代码。MySQL支持可在编译时指定的很多不同的字符集。
    表和列的别名符合 SQL92 标准。
    DELETE、INSERT、REPLACE和UPDATE 返回有多少行被改变(受影响)。
    函数名不会与表或列名冲突。例如ABS是一个有效的列名字。对函数调用的唯一限制是函数名与随后的“(”不能有空格。详见7.31 MySQL对保留字很挑剔吗?。
    所有MySQL程序可以用选项--help或-?获得联机帮助。
    服务器能为客户提供多种语言的出错消息,详见9.1 MySQL支持哪些语言?。
    客户端使用TCP/IP 连接或Unix套接字(socket)或NT下的命名管道连接MySQL。
    MySQL特有的SHOW命令可用来检索数据库、表和索引的信息,EXPLAIN命令可用来确定优化器如何解决一个查询。
     

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

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

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

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

    ISAM表处理器--稳定
    它管理所有在MySQL 3.22和早期版本中的数据的存储和检索。在所有MySQL版本中,代码中已经没有一个单独(报告的)错误。得到一个损坏的数据库表的唯一已知方法是在一个更新中途杀死服务器,即使这样也不大可能破坏任何数据而不能挽救,因为所有数据在每个查询之间被倒入(flush)到磁盘,而且从来没有一个有关由于MySQL中的错误而丢失数据的错误报告。
    MyISAM 表处理器-- Beta
    这是 MySQL 3.23的新功能,它大部分是基于ISAM表代码但有很多新的有用的功能。
    语法处理器和词法分析器 --稳定
    很长时间没有一个在这个系统中的错误报告。
    C 客户代码--稳定
    没有已知的问题。在早期的 3. 20版本中,在发送/接收缓冲器的大小上有一些限制。 3.21.x后,现在缓冲器的大小是动态的,可到一个24M的缺省值。
    标准客户程序--稳定
    这些包括mysql、mysqladmin和mysqlshow、mysqldump及mysqlimport。
    基本结构式查询语言--稳定
    基本SQL函数系统、字符串类和动态内存处理,本系统中未见单独报告的错误。
    查询优化程序--稳定
     
    范围优化程序-- Gamma
     
    Join优化器--稳定
     
    锁定-- Gamma
    这是非常依赖于系统的,在某些系统上,用标准操作系统锁定(fcntl())有很大问题,在这些情况下,你应该用选项--skip-locking运行MySQL守护程序。当使用NFS挂载的文件系统,已知在一些 Linux 系统上和SunOS上出现问题。
    Linux 线程-- Gamma
    唯一发现的问题式fcntl()调用,它通过使用mysqld的--skip-locking选项解决。一些人已经报告了0.5版中的锁定问题。
    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 ):

    MySQL使用Unix时间函数并且在2069年前没有日期问题, 所有2位年份被认为在1970年到2069年的范围,这意味着如果在一个year类型的列中存储的01,MySQL把它当作2001。
    所有MySQL日期函数存储在一个文件\sql/time.cc\中,并且很仔细地编码保证是2000年安全的 。
    MySQL 3.22 和以后的版本,新的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 问题和日期类型。

    1.7 SQL一般信息和教程
    在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 一般的数据库链接