MySQL中⽂参考⼿册
1 MySQL 的⼀般信息
这是MySQL参考⼿册;它记载了MySQL版本3.23.7-alpha。
MySQL 是⼀个快速、多线程、多⽤户和强壮的SQL数据库服务器。
对Unix和 OS/2 平台,MySQL基本上是免费的;但对微软平台,你在30 天的试⽤期后必须获得⼀个MySQL 许可证。详见。
提供有关MySQL的最新信息。
对于MySQL能⼒的讨论,详见。
对于安装指南,见。对于有关移植MySQL到新机器或操作系统的技巧,参见。
有关从 3.21 版升级的信息,详见。
MySQL的⼊门教程,见。
SQL和基准信息的例⼦,见基准⽬录(在分发中的'sql-bench'⽬录)。
对于新特征和错误修复⼀个历史记录,见。
对于当前已知错误和功能缺陷的⼀张列表,见。
未来计划,见。
这个计划的所有贡献者的名单,见。
重要:
将臭⾍(错误)报告、问提和建议发到邮件列表(原⽂未提供)。
对源代码分发,mysqlbug 脚本可在‘scripts’⽬录下到。对⼆进制的分发,mysqlbug可在‘bin’⽬录下到。
如果你有任何关于这本⼿册的增补或修正的任何建议,请将它们发给⼿册⼩组()。
1.1 什么是 MySQL?
霹雳书坊吞海MySQL是⼀个真正的多⽤户、多线程SQL数据库服务器。SQL(结构化查询语⾔)是世界上最流⾏的和标准化的数据库语⾔。MySQL是以⼀个客户机/服务器结构的实现,它由⼀个服务器守护程序mysql
d和很多不同的客户程序和库组成。
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⽂件, HTML版本⾃动地⽤⼀个texi2html改进版本⽣成。普通⽂本和Info版本⽤makeinfo⽣成。 Postscript版本
由texi2dvi和dvips⽣成。PDF 版本⽤pdftex⽣成。
本⼿册由David Axmark, Michael (Monty) Widenius, Paul DuBois and Kim Aldale维护。⽽其他的贡献者,见。
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。见。
可运⾏在不同的平台上,见。
多种列类型:1、 2、 3、4、和 8 字节长度的有符号/⽆符号整
数、FLOAT、DOUBLE、CHAR、VARCHAR、TEXT、BLOB、DATE、TIME、DATETIME、TIMESTAMP、YEAR、SET和ENUM类型。见。
利⽤⼀个优化的⼀遍扫描多重联结(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服务器。见。
具备索引压缩的快速B树磁盘表。
每个表允许有16个索引。每个索引可以由1~16个列或列的⼀部分组成。最⼤索引长度是 256 个字节(在编译MySQL时,它可以改变)。⼀个索引可以使⽤⼀个CHAR或VARCHAR字段的前缀。
定长和变长记录。
⽤作临时表的内存散列表。
⼤数据库处理。我们正在对某些包含 50,000,000 个记录的数据库使⽤MySQL。
所有列都有缺省值,你可以⽤INSERT插⼊⼀个表列的⼦集,那些没⽤明确给定值的列设置为他们的缺省值。
为了可移植性使⽤ GNU Automake , Autoconf 和libtool。
⽤C和C++编写,并⽤⼤量不同的编译器测试。
⼀个⾮常快速的基于线程的内存分配系统。
没有内存漏洞。⽤⼀个商⽤内存漏洞监测程序测试过(purify)。
包括myisamchk,⼀个检查、优化和修复数据库表的快速实⽤程序,详见。
全⾯⽀持ISO-8859-1 Latin1 字符集。例如,斯堪的纳维亚的字符 @ringaccent{a}, @"a and @"o 在表和列名字被允许。
所有数据以 ISO-8859-1 Latin1 格式保存。所有正常的字符串⽐较是忽略⼤⼩写的。
根据 ISO-8859-1 Latin1 字符集进⾏排序(⽬前瑞典语的⽅式)。通过在源代码中增加排序顺序数组可以改变它。为了理解⼀个更⾼级的排序例⼦,看⼀看捷克语的排序代码。MySQL⽀持可在编译时指定的很多不同的字符集。
表和列的别名符合 SQL92 标准。
DELETE、INSERT、REPLACE和UPDATE 返回有多少⾏被改变(受影响)。
函数名不会与表或列名冲突。例如ABS是⼀个有效的列名字。对函数调⽤的唯⼀限制是函数名与随后的“(”不能有空格。详见。
所有MySQL程序可以⽤选项--help或-?获得联机帮助。
服务器能为客户提供多种语⾔的出错消息,详见。
客户端使⽤TCP/IP 连接或Unix套接字(socket)或NT下的命名管道连接MySQL。
MySQL特有的SHOW命令可⽤来检索数据库、表和索引的信息,EXPLAIN命令可⽤来确定优化器如何解决⼀个查询。
1.5 MySQL的稳定性?
本⼩节回答这样的问题:“MySQL的稳定程度?”和 “我能在本项⽬中依赖MySQL吗?”。这⾥我们将试图澄清⼀些问题并且回答似乎很多⼈关⼼的更重要的问题。本节已经与从邮件列表(它在报导错误是很活跃的)收集了的信息综合在⼀起。
对TcX,MySQL在我们⾃1996中期开始的计划中运⾏没有发⽣任何问题。当MySQL被更公开地发布时,我们注意到了有⼀些 “未测试代码”⽚断很快地被不同于我们的查询⽅式的新⽤户发现。每个新版本⽐前⼀个都有更少的可移植性问题(尽管每个发⾏有许多新功能),并且我们希望有可能把下⼀个版本之⼀标记为“稳定”的。
每个MySQL的发⾏都是可⽤的,并且只有当⽤户使⽤从“灰⾊地带”来的代码时才有问题,当然,不知情的⽤户不能知道灰⾊地带是什么;本⼩节尝试揭⽰我们⽬前已知的东西。这⾥的描述涉及MySQL 3. 22.x 版本。所有已知和报告的错误都会在最新的版本被更正,除了在错误⼩节中列出的与“设计n”有关的错误。详见。
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⽇期函数存储在⼀个⽂件''中,并且很仔细地编码保证是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 |
+------------+---------------------+----------------+
mysql 备份数据库13 rows in set (0.00 sec)
这表⽰DATE和DATETIME类型将不会有未来⽇期的任何问题(它们处理⽇期到 9999 )。
TIMESTAMP类型被⽤来存储当前时间,有⼀个仅2030-01-01的上限。TIMESTAMP在32位的机器上(有符号值)有⼀个从1970到2030的范围,在64位机器上它处理时间可达2106(⽆符号值)。
尽管MySQL是顺应Y2K的,但提供⽆⼆义性的输⼊是你的责任。对于MySQL处理⼆义性⽇期的输⼊(包含2位数字年份)的规则,详见。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
php的array函数ISBN 0-201-62623-3mysql是什么系统
www.awl
培训机构资质这本书也接受了 MySQL ⽤户的⼀些建议:
Martin Gruber
Understanding SQL
ISBN 0-89588-644-8
Publisher Sybex 510 523 8233
Alameda, CA USA
1.8 有⽤的MySQL相关链接
1.8.1 教程
静态网页设计与制作论文新⼿如何在⼀台Windows 机器上安装和设置MySQL。
1.8.2 Perl相关链接
1.8.3 MySQL 讨论论坛
1.8.4 ⽀持 MySQL 的商业应⽤
是世界的第⼀个商业电话扫描仪.近年来的很多侵⼊不是通过因特⽹,⽽是通过⾮法的拨号调制解调器. PhoneSweep 让你通过循环地将电话发到你的公司控制的每个号码上来发现这些调制解调器, PhoneSweep有⼀个内置的专家系统,能识别出超过 250 种不同类型的遥远存取程序,包括Carbon CopyT 、pcANYWHERET 和 Windows NT RAS .所有信息保存在SQL数据库,最后产⽣⼀份详细易懂的报告,说明你公司内那个拨号调制解调器的那项服务被刺探。
1.8.5 SQL客户程序
⽤ Perl编写,将成为Bazaar的⼀部分。
1.8.6 ⽀持MySQL的Web 开发⼯具
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论