MySQL 是基于SQL的客户/服务器模式的关系数据库管理系统,它
具有功能强大、使用简单、管理方便、运行速度快、安全可靠性强等
优点,特别适用于Web站点或应用软件的数据库后端的开发工作。另外
,用户可利用许多语言编写访问MySQL数据库的程序。本书通过两个样
板数据库,详细介绍了MySQL的基本概念、基本技巧、编程方法、管理
特点以及第三方工具(如PHP和Perl)的使用方法。第2版保留了第1版
的优点,同时增加了MySQL 4.0.1和相关编程语言接口的最新信息。
本书内容完善、条理清晰,适合数据库、网络开发与管理等人员
参考。
作为开放源代码运动的产物之一,MySQL关系数据库管理系统越来
越受到人们的青睐,应用范围也越来越广。闻名遐迩的速度和易用性
使MySQL特别适用于Web站点或应用软件的数据库后端的开发工作。
如果你想高效且富有成果地使用MySQL.就应该好好读读本书。本
书对以下几个方面进行了全面细致的讨论:如何建立MySQL数据库、如
何把MySQL与PHP或Perl结合起来以生成动态的Web网页,如何管理MySQ
L服务器。
“在我曾阅读过的各种技术论著中,这本书是最好的技术书籍之
一。”
——C&C++用户联合会,《C Vu》杂志主编Gregory Haley
“对于这本用户指南加参考手册形式的著作。我只能用‘无出其
右’来形容。我的结论是:在MySQL数据库的日常使用和维护方面,只
要有了这本书就可以高枕无忧了。”
——《Web Techniques》杂志主编Eugene Kim
前言\r\n第一部分 MySQL基础知识\r\n第1章 MySQL和SQL入门 2\r\n1.1 MySQL概述 2\r\n1.2 样板数据库 5\r\n1.2.1 美国历史研究会 6\r\n1.2.2 考试记分项目 8\r\n1.2.3 关于样板数据库的说明 8\r\n1.3 数据库基本术语 9\r\n1.3.1 数据库的组织结构术语 9\r\n1.3.2 数据库查询语言术语 11\r\n1.3.3 MySQL的体系结构术语 11\r\n1.4 MySQL教程 13\r\n1.4.1 获得样板数据库 13\r\n1.4.2 最低配置要求 14\r\n1.4.3 建立和断开与服务器的连接 15\r\n1.4.4 发出查询命令 17\r\n1.4.5 创建数据库 19\r\n1.4.6 创建数据表 20\r\n1.4.7 添加新记录 35\r\n1.4.8 对信息进行检索 39\r\n1.4.9 删除或更新现有的数据记录 70\r\n1.5 交互式客户程序mysql的使用技巧 72\r\n1.5.1 简化连接过程 73\r\n1.5.2 减少查询命令的输入 75\r\n1.5.3 改变mysql客户程序的提示符 78\r\n1.6 今后各章的学习计划 79\r\n第2章 MySQL数据库里的数据 80\r\n2.1 MySQL的数据类型 81\r\n2.1.1 数值 81\r\n2.1.2 字符串(字符)值 82\r\n2.1.3 日期和时间值 83\r\n2.1.4 NULL值 84\r\n2.2 MySQL的数据列类型 84\r\n2.2.1 数据列类型概述 84\r\n2.2.2 数据表的创建 86\r\n2.2.3 数值类数据列类型 87\r\n2.2.4 字符串类数据列类型 95\r\n2.2.5 日期和时间类数据列类型 108\r\n2.3 序列与编号 115\r\n2.3.1 ISAM数据表里的AUTO_INCREMENT\r\n数据列 115\r\n2.3.2 MyISAM数据表里的AUTO_INCREMENT\r\n数据列 117\r\n2.3.3 HEAP数据表里的AUTO_INCREMENT\r\n数据列 119\r\n2.3.4 BDB数据表里的AUTO_INCREMENT\r\n数据列 119\r\n2.3.5 InnoDB数据表里的AUTO_INCREMENT\r\n数据列 119\r\n2.3.6 使用AUTO_INCREMENT机制时的\r\n注意事项 119\r\n2.3.7 强制MySQL不要复用已经用过的\r\n序列值 120\r\n2.3.8 给数据表增加一个序列编号数据列 121\r\n2.3.9 重新编排现有的序列编号 121\r\n2.3.10 在不使用AUTO_INCREMENT机制的\r\n情况下生成序列编号 122\r\n2.4 MySQL对字符集的支持 124\r\n2.4.1 MySQL 4.1之前版本对字符集\r\n的支持 125\r\n2.4.2 MySQL 4.1及以后版本对字符集\r\n的支持 126\r\n2.5 选择数据列类型 128\r\n2.5.1 这个数据列将用来存放哪一种数据 130\r\n2.5.2 数据值是否都位于某个区间范围内 132\r\n2.5.3 有没有性能和效率方面的问题 134\r\n2.5.4 打算如何对有关数据进行比较 136\r\n2.5.5 是否要在某个数据列上建立索引 136\r\n2.5.6 数据列类型选择问题的内在联系 137\r\n2.6 表达式求值与类型转换 137\r\n2.6.1 书写表达式 138\r\n2.6.2 类型转换 145\r\n第3章 MySQL SQL语法及其使用 153\r\n3.1 MySQL的命名规则 154\r\n3.1.1 数据库组成元素的命名规则 155\r\n3.1.2 SQL语句对字母大小写的要求 157\r\n3.2 数据库的选定. 创建. 丢弃和变更 158\r\n3.2.1 数据库的选定 158\r\n3.2.2 数据库的创建 158\r\n3.2.3 数据库的丢弃 159\r\n3.2.4 数据库的变更 159\r\n3.3 数据表的创建. 丢弃. 索引和变更 159\r\n3.3.1 数据表类型 159\r\n3.3.2 数据表的创建 164\r\n3.3.3 数据表的丢弃 171\r\n3.3.4 数据表的索引 171\r\n3.3.5 变更数据表的结构 176\r\n3.4 获得关于数据库和数据表的信息 180\r\n3.4.1 确定MySQL服务器所支持的\r\n数据表类型 181\r\n3.4.2 检查数据表是否存在及其类型 182\r\n3.5 涉及多个数据表的查询操作 183\r\n3.5.1 单关联 184\r\n3.5.2 全关联 184\r\n3.5.3 左关联和右关联 186\r\n3.5.4 使用子选择 190\r\n3.5.5 涉及多个数据表的UNION查询 193\r\n3.6 涉及多个数据表的删除和修改操作 198\r\n3.7 事务处理 199\r\n3.7.1 事务处理机制的用途 200\r\n3.7.2 事务问题的非事务实现办法 201\r\n3.7.3 利用事务处理机制来保证语句的\r\n安全执行 203\r\n3.8 外键与引用完整性 207\r\n3.9 使用FULLTEXT全文本搜索 213\r\n3.10 代码注释 218\r\n3.11 MySQL不支持的特征 219\r\n第4章 查询优化 221\r\n4.1 索引的使用 221\r\n4.1.1 索引的优点 222\r\n4.1.2 索引的缺点 224\r\n4.1.3 挑选索引 225\r\n4.2 MySQL的查询优化程序 227\r\n4.2.1 查询优化程序的工作原理 228\r\n4.2.2 抑制优化程序给出的方案 231\r\n4.3 数据列类型与查询效率 232\r\n4.4 更有效地加载数据 235\r\n4.5 调度和锁定问题 238\r\n4.6 系统管理员所完成的优化 241\r\n4.6.1 查询缓存区 243\r\n4.6.2 与硬件有关的优化问题 245\r\n第二部分 MySQL程序设计接口\r\n第5章 MySQL程序设计简介 248\r\n5.1 为什么要自行编写MySQL程序 248\r\n5.2 可用于MySQL的API 251\r\n5.2.1 C API 253\r\n5.2.2 Perl DBI API 254\r\n5.2.3 PHP API 255\r\n5.3 选择API 257\r\n5.3.1 运行环境 257\r\n5.3.2 性能 258\r\n5.3.3 开发周期 260\r\n5.3.4 可移植性 262\r\n第6章 MySQL应用程序设计接口:\r\nC语言 263\r\n6.1 客户程序的制作流程 264\r\n6.1.1 对系统的基本要求 264\r\n6.1.2 MySQL客户程序的编译和链接 264\r\n6.2 客户程序1—连接到服务器 266\r\n6.3 客户程序2—增加出错检查功能 269\r\n6.4 客户程序3—运行时获取连接参数 273\r\n6.4.1 访问选项文件的内容 274\r\n6.4.2 处理命令行参数 278\r\n6.4.3 把选项处理机制融合到MySQL客户\r\n程序里 285\r\n6.5 查询的处理 289\r\n6.5.1 处理无结果集的查询 291\r\n6.5.2 处理有结果集的查询 292\r\n6.5.3 一个通用的查询处理程序 295\r\n6.5.4 另一种查询处理方案 297\r\n6.5.5 mysql_store_result()与mysql_use_result()\r\n函数的对比 298\r\n6.5.6 结果集元数据的使用 300\r\n6.6 客户程序4——交互式查询程序 305\r\n6.7 编写具备SSL支持的客户程序 306\r\n6.8 嵌入式MySQL服务器程序开发库的使用 311\r\n6.8.1 编写一个内建有嵌入式MySQL服务器\r\n的应用程序 311\r\n6.8.2 生成一个内建有嵌入式MySQL服务器\r\n的应用程序可执行二进制文件 314\r\n6.9 其他论题 314\r\n6.9.1 在结果集上进行计算 315\r\n6.9.2 对查询命令中的特殊字符进行编码 316\r\n6.9.3 对图像数据进行处理 318\r\n6.9.4 获取关于数据表结构的信息 320\r\n6.9.5 MySQL程序设计工作中的常见错误及\r\n预防办法 320\r\n第7章 MySQL应用程序设计接口:\r\nPerl DBI 324\r\n7.1 Perl语言脚本程序的特点 324\r\n7.2 Perl DBI概述 325\r\n7.2.1 DBI数据类型 325\r\n7.2.2 一个简单的DBI脚本 326\r\n7.2.3 出错处理 331\r\n7.2.4 处理没有结果集的查询 334\r\n7.2.5 处理有结果集的查询 335\r\n7.2.6 引号问题 345\r\n7.2.7 占位符与参数绑定 348\r\n7.2.8 把查询结果绑定给脚本变量 350\r\n7.2.9 设定MySQL服务器连接参数 351\r\n7.2.10 调试 354\r\n7.2.11 结果集元数据的使用 358\r\n7.2.12 用DBI脚本来实现事务处理机制 362\r\n7.3 DBI脚本实战 364\r\n7.3.1 美国历史研究会:生成会员名录 364\r\n7.3.2 美国历史研究会:发出会费催交\r\n通知 370\r\n7.3.3 美国历史研究会:编辑会员记录项 376\r\n7.3.4 美国历史研究会:查找兴趣相同\r\n的会员 381\r\n7.3.5 美国历史研究会:把会员名录\r\n放到网上 382\r\n7.4 用DBI模块来开发Web应用 385\r\n7.4.1 配置Apache服务器来使用CGI脚本 386\r\n7.4.2 CGI.pm模块简介 388\r\n7.4.3 从Web脚本连接MySQL服务器 394\r\n7.4.4 基于Web的数据库浏览器 397\r\n7.4.5 考试记分项目:考试分数浏览器 402\r\n7.4.6 美国历史研究会:查找兴趣相同\r\n的会员 405\r\n第8章 MySQL应用程序设计接口:\r\nPHP语言 410\r\n8.1 PHP语言概述 411\r\n8.1.1 函数与include文件的使用 418\r\n8.1.2 一个简单的数据检索页面 422\r\n8.1.3 对查询结果进行处理 425\r\n8.1.4 返回结果里NULL值的检测 431\r\n8.1.5 出错处理 432\r\n8.1.6 引号问题 434\r\n8.2 PHP脚本实战 435\r\n8.2.1 考试记分项目:考试分数的录入 436\r\n8.2.2 美国历史研究会:总统生平小测验 449\r\n8.2.3 美国历史研究会:会员个人资料的在\r\n线修改 454\r\n第三部分 MySQL系统管理\r\n第9章 MySQL系统管理简介 464\r\n9.1 管理职责概述 464\r\n9.2 日常管理 465\r\n9.3 安全问题 466\r\n9.4 数据库修复和维护 467\r\n第10章 MySQL的数据目录 468\r\n10.1 数据目录的位置 468\r\n10.2 数据目录的结构 471\r\n10.2.1 MySQL服务器如何提供对数据\r\n的访问 472\r\n10.2.2 MySQL数据库在文件系统里\r\n如何表示 473\r\n10.2.3 MySQL数据表在文件系统里\r\n如何表示 474\r\n10.2.4 SQL语句如何映射为数据表\r\n文件操作 475\r\n10.2.5 操作系统对数据库和数据表命名\r\n的限制 476\r\n10.2.6 影响数据表最大尺寸的因素 478\r\n10.2.7 数据目录的结构对系统性能\r\n的影响 479\r\n10.2.8 MySQL状态文件和日志文件 480\r\n10.3 重新安置数据目录的内容 483\r\n10.3.1 重新安置方法 483\r\n10.3.2 评估重新安置的效果 484\r\n10.3.3 重新安置整个数据目录 485\r\n10.3.4 重新安置一个数据库 485\r\n10.3.5 重新安置一个数据表 487\r\n10.3.6 重新安置InnoDB表空间 487\r\n10.3.7 重新安置状态文件和日志文件 488\r\n第11章 MySQL数据库系统的日常管理 489\r\n11.1 新MySQL软件的安全措施 489\r\n11.1.1 权限表的初始设置情况是怎样的 490\r\n11.1.2 为MySQL初始账户设置口令 491\r\n11.1.3 为第二个MySQL服务器设置口令 493\r\n11.2 安排MySQL服务器的启动和关闭 494\r\n11.2.1 在UNIX系统上运行MySQL服务器 494\r\n11.2.2 在Windows系统上运行MySQL\r\n服务器 498\r\n11.2.3 设定MySQL服务器的启动选项 500\r\n11.2.4 关闭服务器 501\r\n11.2.5 在连接不上MySQL服务器时重新获得\r\n对服务器的控制 502\r\n11.3 管理MySQL用户账户 504\r\n11.3.1 创建MySQL用户账户并进行授权 505\r\n11.3.2 收回权限和删除用户 514\r\n11.3.3 修改口令或重新设置丢失的口令 515\r\n11.4 维护日志文件 515\r\n11.4.1 常规查询日志 518\r\n11.4.2 慢查询日志 518\r\n11.4.3 变更日志 518\r\n11.4.4 二进制变更日志和二进制日志\r\n索引文件 519\r\n11.4.5 错误日志 520\r\n11.4.6 日志文件的失效处理 521\r\n11.5 其他MySQL服务器配置问题 527\r\n11.5.1 对MySQL服务器的连接监听情况\r\n进行控制 527\r\n11.5.2 激活或者禁用LOAD DATA语句的\r\nLOCAL能力 528\r\n11.5.3 国际化和本地化问题 528\r\n11.5.4 选择数据表处理程序 531\r\n11.5.5 配置InnoDB表空间 532\r\n11.5.6 优化MySQL服务器 536\r\n11.6 运行多个MySQL服务器 540\r\n11.6.1 运行多个MySQL服务器需要注意\r\n的问题 541\r\n11.6.2 配置和编译不同的MySQL服务器 543\r\n11.6.3 设定MySQL服务器启动选项\r\n的策略 544\r\n11.6.4 用mysqld_multi脚本来启动多个\r\nMySQL服务器 545\r\n11.6.5 在Windows系统上运行多个\r\nMySQL服务器 547\r\n11.7 设置镜像服务器 549\r\n11.7.1 镜像机制概念 549\r\n11.7.2 建立主-从镜像关系 550\r\n11.8 升级MySQL软件 553\r\n第12章 MySQL安全技术 556\r\n12.1 内部安全性:防止未经授权的文件\r\n系统访问 556\r\n12.1.1 如何偷取数据 557\r\n12.1.2 保护你的MySQL安装程序 558\r\n12.2 外部安全性:防止未经授权的\r\n网络访问 564\r\n12.2.1 MySQL权限表的结构和内容 564\r\n12.2.2 MySQL服务器如何对客户进行\r\n访问控制 571\r\n12.2.3 一个与权限有关的难题 576\r\n12.2.4 应该避免的权限表风险 579\r\n12.2.5 不用GRANT语句创建MySQL\r\n账户 581\r\n12.3 建立加密连接 583\r\n第13章 MySQL数据库的备份. 维护\r\n和修复 587\r\n13.1 与MySQL服务器进行协调 588\r\n13.1.1 使用内部锁定机制防止两个操作\r\n相互干扰 589\r\n13.1.2 使用外部锁定机制防止两个操作\r\n相互干扰 592\r\n13.2 在灾难发生前做好准备工作 593\r\n13.2.1 充分利用MySQL服务器的自动\r\n恢复能力 593\r\n13.2.2 备份和拷贝数据库 594\r\n13.3 数据表修复和数据恢复 602\r\n13.3.1 检查和修复数据表 602\r\n13.3.2 使用备份恢复数据 609\r\n第四部分 附 录\r\n附录A 获得并安装有关软件 616\r\n附录B 数据列类型指南 633\r\n附录C 操作符与函数用法指南 643\r\n附录D SQL语法指南 694\r\n附录E MySQL程序使用指南 769\r\n附录F C API指南 829\r\n附录G Perl DBI API指南 864\r\n附录H PHP API指南 891\r\n附录I 挑选ISP 922
作者介绍
Paul DuBois是一位作家, 一名数据库管理员. 同时也是开放源代码和MySQL阵营里的一位旗手. 他曾参与过MySQL在线文档的编写工作. 除这本书以外, 他的主要著作还包括((MySQL and Perl for the Web》. 《MySQL Cookbook》. 《Using csh and tcsh》以及《Software Portability with imake》等.
前 言
无论是在商业. 科研和教育等方面的传统应用项目里, 还是作为因特网搜索引擎的后端支持, 关系数据库管理系统(relational database management system, RDBMS)在许多场合都是一种极其重要的工具. 如果没有充足的信息资源以及一整套良好的管理手段, 建立一个良好的数据库系统就无从谈起, 但有无充足的财力也是很多企事业单位能否建立起自己的数据库系统的关键因素之一. 从历史情况看, 数据库系统一直是一项昂贵的财产—无论是软件本身还是后续的技术支持, 供货商从来都是漫天要价. 此外, 为了获得令人满意的性能表现, 数据库引擎还往往会对计算机硬件有一些特殊的要求, 而这又将使数据库系统的运营成本大大增加.
计算机硬件和软件在最近几年里的发展已经使这种情况得到了一定程度的改善. 个人电脑的价格越来越低, 性能却越来越高, 而高性能的操作系统, 如BSD UNIX操作系统的几种变体(例如FreeBSD. NetBSD. OpenBSD等)以及各种Linux版本(例如RedHat. Caldera. LinuxRPC等), 也不断通过价格低廉的光盘被大量移植到个人电脑上, 有些软件甚至可以通过因特网免费获得.
免费的操作系统大大增强了个人电脑的处理能力, 与此同时, 诸如GNU C编译器gcc之类的软件开发工具不仅在品种上越来越多, 而且在品质和功能上也越来越完善. 通过这些努力, 高品质软件已经不再是普通用户可望而不可及的东西, 只需付出很少的代价, 任何人都能得到他想要的软件. 这正是开放源代码(Open Source)运动的目的所在, 而且它已经能够为我们提供多种重要的软件产品了, 因特网上使用范围最广的Web服务器Apache就是一个最好的例子. “开放源代码”运动的成功范例还包括非常适合用来编写脚本程序的Perl语言. 非常便于编写动态Web页面的PHP语言等等. 与此形成鲜明对照的是, 如果你决定采用某种专利性的商业化解决方案, 就不得不忍受其供货商的漫天要价, 而且, 即使你为这个专利性的商业化解决方案支付了很高的费用, 却极可能根本看不到它的源代码.
“开放源代码”运动也使数据库软件变得越来越容易获得. 比如, PostgreSQL就是一种可以免费获得的数据库管理系统. 而最近一个时期以来, 有些商业化数据库管理系统(比如Informix和Oracle)的供货商也开始为Linux等操作系统免费提供它们的软件产品. 但令人遗憾的是, 这些免费提供的商业化数据库系统通常只包括二进制代码形式, 而且不提供技术支持, 这就使它们的用处和价值大打折扣.
MySQL是另一种低成本的数据库解决方案, 它是一种基于SQL的客户/服务器模式的关系数据库管理系统, 最初起源于欧洲的斯堪地那维亚半岛. MySQL由以下组件构成:一个SQL服务器. 一些用来访问该服务器的客户端程序. 一套用来对数据库进行管理的软件工具, 以及一个为自行编写程序的数据库用户提供的程序设计接口.
MySQL起源于Michael Widenius(绰号Monty)在1979年为瑞士的TcX公司开发的UNIREG数据库工具. 到了1994年, TcX公司开始寻求一种能够用来开发Web应用的SQL服务器. TcX公司对几种商业化的服务器进行了测试, 但对它们在处理TcX公司的大数据表时的速度都不太满意. 该公司还测试了mSQL, 但它又缺少某些必要的功能. 因此, Monty开始开发一种新的服务器. 因为mSQL有一些能够免费获得的软件工具, 所以新服务器的程序设计接口被有意识地设计成与mSQL所使用的程序设计接口非常相似—采用相似的程序设计接口将大大减少把免费的软件工具移植到MySQL上的工作量.
到了1995年, Detron HB公司的David Axmark开始在因特网上推广和发行TcX公司研发的MySQL. David为MySQL编写了使用文档, 并给MySQL增加了利用GNU组织的configure工具进行安装配置的功能. 适用于Linux和Solaris系统的MySQL 3.11.1的二进制版本于1996年开始面世. 如今, MySQL不仅能够在多种计算机平台上运行, 而且还同时提供有二进制版本和源代码版本. MySQL的发行. 技术支持与培训工作目前由专门为此组建的MySQL AB公司负责.
MySQL的开发和完善工作目前仍在不断地进行当中. 发展到今天, 大型数据库系统所必须具备的某些功能, 比如事务处理. 数据行锁定. 外键支持以及数据镜像等, 都已经被添加到MySQL里了, 这使不少原来只考虑采购“大引擎”而对MySQL不屑一顾的用户开始重新审视和评估MySQL.
MySQL是一个“开放源代码”项目, 在绝大多数场合都能免费使用, 这使它在“开放源代码”界中享有很高的知名度. 但必须指出的是, MySQL的知名度并不仅仅局限于“开放源代码”运动的支持者. 的确, MySQL原本是运行在个人电脑上的(事实上, MySQL的很多开发工作都是在低廉的Linux系统上完成的), 但它完全可以被移植并运行在商业化的操作系统(比如Solaris. Mac OS X. Windows)以及各种企业级的服务器硬件上. 此外, MySQL的运行性能绝不逊色于任何一种你打算与之进行比较的数据库系统, 即使面对拥有百万级数据记录的大型数据库, 它也能游刃有余.
在功能强大但价格低廉的硬件设备上运行着免费的操作系统, 越来越多的人在范围越来越广的硬件系统上拥有了越来越强大的计算能力, 这是未来呈现在我们面前的一幅崭新画面, 而MySQL在这幅画面里牢牢占据着一个显著的位置. 获得强大计算能力的门槛正变得越来越低, 而大型数据库解决方案对普通用户和中小企业来说也已经不再是可望而不可及的了. 在过去, 高性能的RDBMS只是广大中小企业的梦想, 而现在, 只需付出极低的成本和代价就能享用到这些东西. 这一点对个人用户而言就更加突出了. 就拿我本人来说吧, 我有一台苹果电脑公司出品的iBook笔记本电脑, 在它的Mac OS X操作系统上, 我同时使用着MySQL以及Perl. Apache和PHP. 这使我能够随时随地进行工作, 而这一解决方案的总成本只是购买iBook笔记本电脑的价钱而已.
为什么选用MySQL
如果你正在寻求一种完全免费或者价格比较低廉的数据库管理系统, 那就不妨对以MySQL. PostgreSQL(一种完全免费但供货商不提供技术支持的数据库引擎)为代表的有关软件进行一下对比评估. 在对MySQL和其他数据库系统进行评估之前, 首先要把对自己最为重要的因素弄清楚, 需要从运行性能. 技术支持. 特色功能(比如与SQL的兼容程度和可扩展性等). 许可条款. 购买价格等多方面进行全面考虑. 依我之见, MySQL在以下方面有比较吸引人的优势:
?运行速度—MySQL的运行速度相当快. MySQL的开发人员认为它是目前最快的数据库管理系统. 可以从MySQL的Web站点上的性能对照页面中查到有关数据:http: //www.mysql.com /benchmark.html.
?易使用性—MySQL是一种简单易用的高性能数据库管理系统, 与其他大型数据库管理系统相比, MySQL的安装和管理工作要容易得多.
?查询语言支持—MySQL支持SQL语言, 该语言是所有现代数据库系统的首选查询语言.
?功能丰富—MySQL允许多个客户端同时与服务器建立连接. 客户端可以同时打开并使用多个数据库. 可以通过好几种办法(比如命令行客户程序. Web浏览器. X窗口系统下的客户程序等等)对MySQL数据库进行交互式访问, 在输入查询命令后可立刻看到查询结果. 此外, MySQL还提供了C. Perl. Java. PHP. Python等多种程序设计语言的编程接口. 你还可以通过支持ODBC(Open Database Connectivity, 开放数据库连接, 一种由微软公司开发的数据库通信协议)功能的应用程序来访问MySQL数据库. 也就是说, 你既可以选用现成的客户程序来访问MySQL数据库, 也可以根据具体的应用情况来编写相关的软件.
?优异的联网和安全性能—MySQL是网络化的数据库系统, 用户可以从因特网上的任意地点访问MySQL数据库, 完全可以把数据与世界上任何地方的任何人共享. 同时, MySQL还具备完善的访问控制机制, 这就使那些不应该看到你数据的人不能看到你的数据. 此外, 为了提供更进一步的安全措施, MySQL还支持使用SSL(Secure Socket Layer, 安全套接字层)协议的加密连接.
?可移植性—MySQL既能够运行在多种版本的UNIX操作系统上, 也能够运行在诸如Windows或者OS/2之类的非UNIX系统上. MySQL可以运行在从家用电脑到企业级高端服务器的全系列硬件设备上.
?短小精悍—与某些商业化数据库系统巨大的硬盘空间消耗量相比, MySQL发行版本的硬盘占用量相对小得多.
?成本低廉—MySQL是一个“开放源代码”项目, 只要你遵守GNU组织的通用公共许可证(General Public License, GPL)条款, 就可以不受任何限制地使用. 这意味着MySQL在大多数情况下都是免费的(但如果你想通过销售MySQL或者提供与之相关的服务来赚钱, 那就必须得到MySQL AB公司的许可和授权).
?来源广泛—MySQL很容易获得, 只要你有Web浏览器, 就能从许多地方下载到它. 如果你想知道其中某个组件的工作原理或者对它的某个算法感到好奇, 完全可以通过它的源代码来进行钻研. 如果你不喜欢它的某个组件, 也完全可以自行加以修改. 如果你认为自己发现了一个bug(程序漏洞), 也完全可以报告给有关开发人员.
MySQL的技术支持怎么样?这个问题问得好—没有必要的技术支持, 很难用好一种数据库. 我本人当然希望这本书能够满足你在数据库方面的全部需要, 但在实际工作中, 你肯定会遇到一些我根本没有想到或者没有在这本书里讨论到的问题. 不过你用不着为这件事担心—网上有大量与MySQL有关的资源, 足以满足你的任何要求. MySQL是免费的, 但这并不意味着你在安装和使用MySQL时是孤军奋战. 下面是一些最方便的MySQL资源:
?MySQL的发行版本都带有MySQL Reference Manual(MySQL参考手册), 也可以在网上找到它. MySQL用户对这本手册给予了很高的评价, 这一点非常重要—如果没有一本好用的参考手册, 再好的软件产品也会贬值.
?如果你想得到正规的培训或者专业化的技术支持, 可以报名参加MySQL AB公司开设的培训课程或者与该公司签订技术支持合同.
?MySQL社团有一个非常活跃的邮件列表, 任何人都能订阅. 这个邮件列表有很多专家级的参与者, 许多MySQL的开发人员都是它的常客. 作为提供技术支持的电子资源, 很多订阅者都认为它物有所值.
MySQL社团(包括开发人员和普通用户在内)是一个非常团结互助的群体. 贴在邮件列表上的求助帖子经常会在几分钟内得到回复. 如果有人报告说发现了一个bug(程序漏洞)并得到确认, 开发人员就会马上发布一个修复方案并经由因特网迅速传遍整个社团. 如此之快的响应速度和如此认真负责的态度在这一领域里的其他公司的技术支持服务站点上是看不到的. (你体会过其他公司的技术支持服务吗?我可是吃过不少苦头的. 在陷入麻烦的时候, 谁都希望能够尽快得到专业的技术支持. 如果一种办法是苦等供货商在他们自认为适当的时候才来“帮助”你, 而另一种做法是你发一个求助帖子并在自己认为适当的时候去看看有没有回音, 你会选择哪一种办法?)
如果你正打算挑选一种数据库产品, 那么MySQL绝对是一个值得考虑的候选者. 试用MySQL既无风险, 也不需要花费金钱. 如果你在评估过程中遇到了问题, 还可以通过我刚才介绍的邮件列表寻求帮助. 当然了, 进行这样的评估必定会花费一些时间, 但无论你原来计划使用哪一种数据库产品, 都要花些时间去进行评估, 所以我想这一点应该不会成为你拒绝给MySQL一个机会的理由—在我看来, 与很多其他的数据库产品相比, 你花在安装和测试MySQL上的时间要更加物有所值.
如果已经运行着其他RDBMS该怎么办
如果你现在已经在使用某种数据库管理系统, 是否应该转换到MySQL上去呢?我的回答是:没有这个必要. 如果你对现有的系统很满意, 为什么还要给自己找麻烦呢?要是你对自己正在使用的数据库产品有所不满, 那就绝对应该给MySQL一个机会. 也许你觉得自己现有系统的性能不太好, 也许它是一个专利性的产品而你又不想吊死在一棵树上, 也许你想更换现有的硬件设备, 可现有的软件系统却不支持, 也许你现有的软件都是二进制代码而你更希望得到一种能够提供源代码的系统, 也许你只是嫌它花钱太多……这一切都是你应该给MySQL一个机会的理由. 你可以先通过这本书来熟悉一下MySQL的功能, 再到MySQL邮件列表上提几个问题, 然后再根据各方面的具体情况慎重地做出抉择.
如果你正准备从另外一种SQL数据库转移到MySQL上, 建议你先到MySQL的Web站点上的产品对比页面(http: //www.mysql.com /information /crash-me.php)上去看一看, 然后再到本书的有关章节里去熟悉一下MySQL所支持的数据类型和有关的SQL概念. 如果你现有的RDBMS系统所支持的SQL版本与MySQL所支持的SQL版本之间的差异比较大, 那么现有应用软件的移植工作就可能要花费相当大的努力和代价才能成功—如果真是这样, 请三思而后行.
不过, 就算你现有的数据库系统“古老”到连SQL也“听”不懂的地步, 也并不意味着你只能望洋兴叹. 不妨从先移植几个有代表性的数据表来开始评估工作, 你也许会发现实际情况并没有想像的那么困难. 我本人就曾有过这样一次经历:我受命把一个根本不“懂”SQL的RDBMS系统移植到MySQL上去, 可这两种系统的编程语言不仅没有一点儿可供利用的近似之处, 而且老系统里的某些数据类型甚至连对应的SQL语言元素都不存在. 这个项目不仅需要对网络访问方法进行转换, 还需要修改很多基于屏幕的数据录入程序和已经定制成套的查询语句. 这个项目让我忙活了大约一个半月的时间, 但最终的效果却相当不错.
随MySQL提供的软件工具
MySQL的发行版本都附带有以下几种工具程序:
?MySQL服务器—运转整个MySQL数据库系统的引擎, 对MySQL数据库的访问和操作都要通过它才能实现.
?用来访问MySQL服务器的客户端程序—其中包括一个供用户直接提交查询并查看其结果的交互式程序和几个用来对数据库站点进行管理和维护的工具程序. 有一个工具程序是用来调控MySQL服务器的, 另几个工具程序则负责完成有关数据的导入导出和用户访问权限的检查工作.
?供用户自行开发应用程序的客户程序开发库—这个开发库是用C语言写的, 所以可以用C语言来编写自己的客户端程序. 此外, 这个开发库还提供了一些供其他程序设计语言使用的第三方接口.
除MySQL本身所提供的软件程序外, 还可以通过因特网等多种途径找到很多高质量的第三方工具软件. 有很多极富聪明才智的人也使用着MySQL, 他们喜欢自己编写一些小程序来提高工作效率, 也喜欢把自己的成果拿出来与大家分享. 在这些第三方工具软件里, 有些能帮助你更加得心应手地使用MySQL, 有些能把MySQL的功能进一步扩展到建设Web站点.
本书能让你学到哪些东西
本书的目的是帮助大家高效率地掌握MySQL的使用方法, 从而高效率地完成自己的本职工作. 从中将会学到怎样才能有效地把信息资料录入数据库. 怎样才能构造出优化的查询语句以迅速获得有关问题的答案数据.
学习和使用SQL并不要求你已经是一名程序员. 本书的内容重点之一就是向大家介绍SQL的工作原理. 但熟悉SQL的语法并不代表你掌握了SQL的使用技巧. 而本书的另一个重点就是介绍MySQL的独家功能以及它们的实际用法.
大家还将学到怎样才能把MySQL与其他软件工具结合起来使用. 本书还将向大家介绍如何通过MySQL与Perl或PHP语言来为数据库的查询结果生成动态Web页面. 自行编写MySQL数据库访问程序也将是本书的学习重点之一. 自行编写的这些程序应该最符合你应用项目的具体要求, 从而大大拓展MySQL的功能, 增加它的应用价值.
对于那些负责MySQL数据库系统的安装和管理工作的人员, 这本书将提供有关职责及其具体实现方式. 你将学会如何建立用户账户. 如何对数据库进行备份以及如何保证数据库的安全.
本书各章内容介绍
本书分为四大部分.
第一部分:MySQL基础知识
?第1章, MySQL和SQL入门—主要内容包括:MySQL的用途与用法, 交互式MySQL客户程序的使用方法, SQL基础知识, MySQL的常用功能.
?第2章, MySQL数据库里的数据—主要内容包括:MySQL为描述数据而提供的数据列类型(column type), 各种类型的特点和局限性, 各种类型的使用时机和使用方法, 如何在类似的数据列类型中做出选择, 表达式的求值办法, 各类型之间的转换机制.
?第3章, MySQL SQL语法及其使用—如今, 各种主流的RDBMS都能识别和理解SQL语言, 但各种数据库引擎所使用的SQL语言彼此有着细微的差异. 本章的介绍重点是使MySQL有别于其他数据库系统的特色功能.
?第4章, 查询优化—如何使查询运行得更有效率.
第二部分:MySQL程序设计接口
?第5章, MySQL程序设计简介—主要内容包括:MySQL提供的几种应用程序设计接口(application programming interface, API)以及本书所涉及的几种API之间的详细对比.
?第6章, MySQL应用程序设计接口:C语言—如何利用MySQL发行版本自带的客户程序开发库所提供的API来编写C语言程序.
?第7章, MySQL应用程序设计接口:Perl DBI—如何利用DBI模块来编写Perl脚本, 包括用于独立单机上的普通脚本和用于Web站点上的CGI脚本.
?第8章, MySQL应用程序设计接口:PHP语言—如何利用PHP脚本语言来编写用来访问MySQL数据库的动态Web页面.
第三部分:MySQL系统管理
?第9章, MySQL系统管理简介—主要内容包括:数据库管理员的工作职责, 怎样才能让数据库站点运行得更成功.
?第10章, MySQL的数据目录—详细介绍MySQL数据目录(即MySQL用来存放各种数据库文件和辅助性文件的区域)的组织布局和内容.
?第11章, MySQL数据库系统的日常管理—主要内容包括:如何正确地完成数据库系统的开机和关机任务, 如何在MySQL系统里建立用户账户, 如何对各种日志文件进行维护和管理, 如何对InnoDB表空间进行配置, 如何对数据库服务器进行优化, 如何运行多个服务器, 如何建立镜像服务器.
?第12章, MySQL安全技术—主要内容包括:如何提高MySQL系统的安全水平以抵御各种入侵和破坏, 入侵可能来自数据库服务器主机, 也可能来自经网络而连接的其他客户端, 如何配置MySQL服务器以支持SSL上的安全连接.
?第13章, MySQL数据库的备份. 维护和修复—主要内容包括:如何通过预防性措施来降低灾难的发生几率, 如何对数据库进行备份, 如何在灾难真的发生时(要知道, 再好的预防性措施也不意味着灾难永远都不会发生)尽快恢复系统的运转.
第四部分:附录
?附录A, 获得并安装有关软件—如何获得并安装本书所提到的有关软件和常用工具程序.
?附录B, 数据列类型指南—MySQL数据列类型的详细描述.
?附录C, 操作符与函数用法指南—在SQL语句中用来编写表达式的操作符和函数的详细描述.
?附录D, SQL语法指南—MySQL所支持的各种SQL语句的详细描述.
?附录E, MySQL程序用法指南—MySQL发行版本所提供的有关程序的详细描述.
?附录F, C API指南—MySQL C语言客户程序开发库所提供的数据类型和函数功能的详细描述.
?附录G, Perl DBI API指南—Perl DBI模块提供的方法和属性的详细描述.
?附录H, PHP API指南—PHP为支持MySQL而提供的函数功能的详细描述.
?附录I, 挑选ISP—作为顾客, 怎样在提供MySQL访问服务的ISP(Internet Service Provider, 因特网服务提供商)中做出选择, 作为ISP, 怎样才能为顾客提供更好的MySQL接入服务.
如何阅读本书
在阅读和学习本书的时候, 希望大家能亲自对各章中的示例进行尝试. 如果你的计算机上还没有安装MySQL, 请先亲自或请别人来把它安装好, 再把样板数据库sampdb的有关文件(本书的许多示例都要用到这个数据库)安装到你的机器里. 获得和安装有关组件的办法与步骤可以在附录A里查到.
如果你是一位MySQL数据库系统或SQL语言的新手, 请从本书的第1章开始学习, 第1章所介绍的MySQL与SQL的基本概念和使用入门对加快本书后续章节的学习进度有很大的帮助. 然后再前进到第2章和第3章去学习如何描述和使用自己的数据, 这样, 就能有针对性地根据自己的具体应用项目去探索各种MySQL功能了.
即使你已经具备了一些SQL方面的经验, 也应该从第2章和第3章开始入手. 不同的RDBMS系统所实现的SQL功能彼此有着细微的差别, 大家应该首先把MySQL有别于自己所熟悉的其他RDBMS系统的那些东西弄清楚.
如果你已经有了一些MySQL方面的经验但还需要进一步了解某些特定工作的原理和细节, 请把这本书当做一本参考大全, 并根据自己的具体需要有选择地查阅本书的有关章节. 从把这本书当做一本参考大全的角度看, 书后的各种附录有着非常高的参考价值.
如果你的兴趣在于怎样才能编写出具备MySQL数据库访问功能的程序, 请从第5章开始去学习有关各种API的章节. 如果你想为自己的数据库开发一些便于使用的基于Web的前端访问程序, 或者想为自己的数据库Web站点开发一些后端程序以便给自己的Web站点增添动态内容, 请阅读第7章和第8章的内容.
如果你打算对MySQL和自己正在使用的RDBMS进行对照评估, 也可以在本书里找到答案. 如果你想了解MySQL与现有的SQL系统有何异同, 请阅读本书第一部分中专门讨论数据类型和SQL语法的有关章节, 如果你打算自行开发应用程序, 请阅读本书第二部分中讨论有关应用程序设计接口的章节, 如果你想了解MySQL提供有何种级别的数据库管理功能, 请阅读本书第三部分中的有关章节. 如果你此前尚未使用过任何一种数据库, 但正在对MySQL和其他数据库系统进行对比评估, 这些内容也将有很大的帮助.
如果你想访问MySQL数据库并正为此而寻找着ISP, 可以在附录I里查到一些挑选准则. 这个附录还对希望提供MySQL服务以吸引新顾客或者希望进一步改善现有顾客服务水平的ISP们提供了一些忠告.
书中涉及的软件及其版本
在编写本书的时候, MySQL的最新版本是4.0系列, 而4.1版本系列正在紧锣密鼓地开发和完善当中. 因此, 本书的讨论将主要集中在这两个版本系列上, 但同时也会兼顾到较早出现的3.22和3.23系列版本中的有关功能.
至于本书所涉及的其他的重要软件包, 它们的最新版本都足以满足书中示例的要求. 下面是部分重要软件包的当前版本:
软 件 包 版 本
Perl DBI 1.32
Perl MySQL DBI驱动程序 2.1020
PHP 4.2.3
Apache 1.3.27 / 2.0.43
CGI.pm 2.87
本书提到的软件都可以在因特网上找到. 附录A对获得并在系统上安装MySQL. Perl DBI. PHP. Apache. CGI.pm等软件及步骤进行了介绍. 这个附录还给出了如何在系统上生成本书所使用的样板数据库以及本书论述程序设计问题的有关章节将会用到的示例程序的办法.
书中使用的符号体例
本书使用的符号体例如下:
主机名. 文件名. 目录名. 命令. 选项和Web站点都用普通英文字体表示. 命令中需要由读者输入的部分用粗体英文字表示. 命令中的斜体字部分表示需要由读者把它替换为自己选择的内容.
此外, 不同的命令行提示符代表了不同的命令执行方式. 百分号(%)是最常见的命令行提示符, 它表示有关命令可以在UNIX系统的shell提示符或者Windows系统的DOS提示符下使用. 井号(#)提示符的意义比较特殊, 它表示有关命令只能由UNIX系统的根用户(即root用户)执行, 而“C:\>”提示符则表示有关命令是Windows下的专用命令. 而在使用mysql程序的过程中发出的SQL语句都跟在提示符“mysql>”后面.
在SQL语句里, SQL关键字和函数名都用大写的英文字母写出, 而数据库. 数据表. 数据列的名称则全部用小写字母写出. 在语法描述中, 方括号([ ])表示有关内容可选.
书中出现的“基于Windows NT的系统”代表由Windows NT衍生出来的各种Windows变体, 包括Windows NT. Windows 2000和Windows XP, 而Windows 95. Windows 98和Windows Me不包括在内.
其他资源
就个人而言, 我希望本书能把大家想知道的关于MySQL的知识都收录在内. 可万一你的问题没能在这本书里找到答案, 又该怎么办呢?
以下是一些有关软件的Web站点:
软件包 主要的Web站点
MySQL http: //www.mysql.com /documentation /
Perl DBI http: //dbi.perl.org /
PHP http: //www.php.net /
Apache http: //www.apache.org /
CGI.pm http: //stein.cshl.org /WWW /software /CGI /
这些Web站点上还有指向其他各种有用的信息资源(比如参考手册. 常见问题解答(frequently asked-question, FAQ)文档以及各种邮件列表)的链接:
?参考手册—参考手册是MySQL发行版本中自带的主要文档. 这些文档的格式有很多种, 网上还有它们的在线版本. PHP的使用手册也有好几种格式. DBI模块及其MySQL专用驱动程序的文档是彼此分开的:DBI的文档侧重于基本概念, 而其MySQL专用驱动程序的文档则侧重于与MySQL有关的各种具体功能.
?FAQ文档—DBI. PHP. Apache各有各的FAQ文档.
?邮件列表—本书所涉及的一些软件有它们各自的邮件列表. 如果你打算使用并想用好某个工具软件, 那最好去订阅一份与之有关的邮件列表. 邮件列表上的论文集或文章汇总也很值得下载来仔细研究:如果你不熟悉某个软件工具的用法, 你的很多问题就可能是很多人已经问过(并得到回答)无数次的了, 你不必再提出类似的问题, 因为它们的答案几乎都能在邮件列表的论文集或文章汇总里找到.
不同的邮件列表有不同的订阅办法, 但你肯定能在下面这些URL地址处找到一些线索:
软件包 邮件列表订阅办法
MySQL http: //www.mysql.com /documentation /
Perl DBI http: //dbi.perl.org /
PHP http: //www.php.net /support.php
Apache http: //www.apache.org /foundation /mailinglists.html
?其他Web站点—除官方Web站点外, 书中涉及的某些软件工具还另有一些提供其他信息(如样板程序的源代码或者热门文章等)的站点. 这些站点大都可以通过各有关官方站点上的链接找到.
使用在线MySQL参考手册
请定期查阅在线MySQL参考手册以获取最新的MySQL信息. 该手册是与MySQL软件同步修改和更新的.
作者简介
Paul DuBois是一位作家, 一名数据库管理员, 同时也是开放源代码阵营里的一位旗手. 除这本书以外, 他的主要著作还包括MySQL and Perl for the Web(用MySQL和Perl开发Web应用). MySQL Cookbook(MySQL使用进阶). Using csh and tcsh(csh和tcsh的使用)以及Software Portability with imake(软件移植工具imake)等.
技术顾问简介
本书的出版离不开有关责任编辑人员的辛勤劳动, 他们使这本书的内容更加充实和完备. 这些细心的专业人士对书中的每一个技术细节都进行了核实和校对, 正是因为他们的努力, 才使本书满足广大读者对一本高质量的技术类书籍的期望和要求.
Shane Kirk毕业于肯塔基大学计算机科学系并获学士学位. 他现在居住于美国俄亥俄州的辛辛那提市, 是Opinion One公司(www.opinionone.com)的数据库管理员和软件开发人员, Opinion One公司的业务重点是开发市场分析软件及有关的解决方案.
Hang T. Lau博士是位于加拿大蒙特利尔市的康考迪亚大学计算机科学系的一位助理教授. 作为一名系统科学家, 他有着超过20年的工作经验, 他的主要研究方向包括电信网络规划. 电信中的语音识别技术. 无线移动网络系统等等.
致谢
感谢以下人员对本书第1版和第2版所给予的支持和帮助.
第1版
感谢以下人员对本书的校对. 批评和指正:David Axmark. Vijay Chaugule. Chad Cunningham. Bill Gerrard. Jijo George John. Fred Read. Egon Schmid和Jani Tolonen. 我还要特别感谢MySQL的主要作者—人称Monty的Michael Widenius, 他不仅细心地校对了本书的手稿, 而且还耐心地解答了我在本书写作过程中向他提出的数以百计的问题. 如果读者还在这本书里发现了错漏, 就只能怪我本人学艺不精了. 我还要感谢Thomas Karlsson. Colin McKinnon. Sasha Pachev. Eric Savage. Derick H. Siddoway以及Bob Worthy, 他们对这本书的初稿进行了认真的校对, 并帮助我把这本书改进成现在的样子.
我还要衷心感谢New Riders出版社的有关工作人员, 没有他们的支持与帮助, 就不可能有这本书的面世. Laurie Petrycki是本书的主编. Katie Purdum是本书的责任编辑, 她一直关心着本书的写作, 并不断督促我抓紧时间完成这项工作. 负责本书整理和文字工作的Leah Williams为这本书加了不少的班—尤其是在本书接近完成的最后阶段. 本书的索引是由Cheryl Lenser和Tim Wright完成的. 本书的项目编辑John Rahm也为这本书倾注了大量的心血. 在此谨向以上人员表示我衷心的感谢.
最后, 我还要感谢我的妻子Karen. 为了支持我的工作, 她推迟了她自己的一本书的写作和出版计划. 正是有了她的忍耐和理解, 我才能整天埋头于写作当中. 没有她的支持, 这本书就不能如此顺利地得以完成, 可以说, 这本书里的每一页都有她的贡献.
第2版
技术顾问在本书的第2版里依然起了重要作用, 他们对书中的错漏进行了认真的查找和纠正, 对含混不清的地方进行了澄清. Hang Lau和Shane Kirk是本版的技术顾问. 我还要感谢Monty Widenius. Alexander Barkov. Jani Tolonen等MySQL开发人员, 他们不厌其烦地解答了我的许多疑问, 使这本书的内容得到了进一步的充实和完善.
感谢New Riders出版社的以下工作人员:出版人Stephanie Wall. 助理编辑Chris Zahn. 高级主编Lori Lyons. 文字编辑Pat Kinyon. 索引编辑Cheryl Lenser. 排版人员Stacey RichwineDeRome.
最后, 我还要感谢这本书的幕后英雄和第一读者—我的妻子Karen. 没有她, 这本书是不可能达到现在这个水平的.
请把你的想法告诉我们
作为本书的读者, 你的意见和看法是最为重要的. 希望大家能够不吝赐教, 告诉我们这本书哪些地方做得不错, 哪些地方还需要改进, 哪些东西是你们想知道而我们又没有收录在其中的—总之, 只要是读者的声音, 我们都将认真听取.
大家可以通过电子邮件或普通信件直接与我联系, 好让我了解你们对这本书的看法以及改进建议. 但我要告诉大家的是, 对于大家在学习本书时遇到的技术性问题, 我不一定能帮得上忙, 而且, 因为我每天都会收到大量的电子邮件, 所以可能无法对每一封邮件做出回复.
在来信的时候, 请大家把本书的书名. 作者以及你的姓名. 电话或者电子邮件地址写清楚. 我将认真对待各位读者的来信并与本书的其他作者和有关编辑人员进行交流. 下面是我们的联系办法:
电子邮件: devlib@samspublishing.com
普通信件: Mark Taber
Associate Publisher
Developer誷 Library
Sams Publishing
201 West 103rd Street
Indianapolis, IN 46290 USA