perl中unicode属性

http://shouce.jb51.net/perl/PatternMatching.html


第五章 模式匹配

 

Perl 内置的模式匹配让你能够简便高效地搜索大量的数据。不管你是在一个巨型的商业门户站点上用于扫描每日感兴趣的珍闻报道,还是在一个政府组织里用于精确地描述人口统计(或者人类基因组图),或是在一个教育组织里用于在你的 web 站点上生成一些动态信息,Perl 都是你可选的工具。这里的一部分原因是 Perl 的数据库联接能力,但是更重要的原因是 Perl 的模式匹配能力。如果你把“文本”的含义尽可能地扩展,那么可能你做的工作中有 90% 是在处理文本。这个领域实在就是 Perl 的最初专业,而且一直是 Perl 的目的——实际上,它甚至是 Perl 的名字:Practical Extraction and Report Language (实用抽取和报表语言)。Perl 的模式提供了在堆积成山的数据中扫描数据和抽取有用信息的强大工具。

你可以通过创建一个正则表达式(或者叫 regex)来声明一个模式,然后 Perl 的正则表达式引擎(我们在本章余下的部分称之为“引擎”)把这个正则表达式拿过并判断模式是否(以及如何)和你的数据相匹配。因为你的数据可能大部分由文本字串组成,所以你没有理由不用正则表达式搜索和替换任意字节序列,甚至有些你认为是“二进制”的数据也可以用正则处理。对于 Perl 而言,字节只不过碰巧是那些数值小于 256 的自然数而已。(更多相关内容见第十五章,Unicode。)

 

如果你通过别的途径已经知道正则表达式了,那么我们必须先警告你在 Perl 里的正则表达式是有些不同的。首先,理论上来讲,它们并不是完全“正则”的,这意味着 Perl 里的正则可以处理比计算机科学课程里教的正则表达式更多的事情。第二,因为它们在 Perl里用得实在是太广泛了,所以在这门语言里,它们有属于自己的特殊的变量,操作符,和引用习惯;这些东西都和语言本身紧密地结合在一起。而不象其他语言那样通过库松散地组合在一起。Perl 的程序员新手常常徒劳地寻找地这样的函数:

 

   match( $string, $pattern );
   subst( $string, $pattern, $replacement );

要知道在 Perl 里,匹配和子串都是非常基本的任务,所以它们只是单字符操作符:m/PATTERN/ 和 s/PATTERN/REPLACEMENT/(缩写为 m// 和 s///)。它们不仅语法简单,而且还象双引号字串那样分析,而不只是象普通操作符那样处理;当然它们的操作还是象操作符的,所以我们才叫它们操作符。你在本章通篇都会看到这些操作符用于匹配字串。如果字串的一部分匹配了模式,我们就说是一次成功的模式匹配。特别是在你用 s/// 的时候,成功匹配的部分将被你在 REPLACEMENT 里声明的内容代替。

本章所有的内容都是有关如何制作和使用模式的。Perl 的正则表达式非常有效,把许多含义包含到了一个很小的表达式里。所以如果你想直接理解一个很长的模式,那很有可能被吓着。不过如果你能把长句分解成短句,并且还知道引擎如何解释这些短句,那你就能理解任何正则表达式。一行正则表达式相当于好几百行 C 或者 JAVA 程序并不罕见。正则表达式可能比一个长程序的单一一行要难理解,但是如果从整体来看,正则表达式通常要比很长的程序要好理解。你只需要提前知道这些事情就可以了。

 

5.1 正则表达式箴言

在我们开始讲述正则表达式之前,让我们先看看一些模式的样子是什么。正则表达式里的大多数字符只是代表自身。如果你把几个字符排在一行,它们必须按顺序匹配,就象你希望的那样。因此如果你写出一个模式匹配:

 

      /Frodo/  (译注:记得电影“魔戒”吗?;))

你可以确信除非该字串在什么地方包含子字串“Frodo”,否则该模式不会匹配上。(一个子字串只是字串的一部分。)这样的匹配可以发生在字串里的任何位置,只要这五个字符以上面的顺序在什么地方出现就行。

其他字符并不匹配自身,而是从某种角度来说表现得有些“怪异”。我们把这些字符称做元字符。(大多数元字符都是自己淘气,但是有一些坏得把旁边的字符也带“坏”了。)

下面的就是这些字符:

 

   \ | ( ) [ { ^ $ * + ? .

实际上元字符非常有用,而且在模式里有特殊的含义;我们会一边讲述,一边告诉你所有的那些含义。不过我们还是要告诉你,你仍然可以在任意时刻使用前置反斜杠的方法来匹配这十二个字符本身。比如,反斜杠本身是一个元字符,因此如果你要匹配一个文本的 反斜杠,你要在反斜杠前面放一个反斜杠:\\。

要知道,反斜杠就是那种让其他字符“怪异”的字符。事实是如果你让一个怪异元字符再次怪异,它就会正常——双重否定等于肯定。因此反斜杠一个字符能够让它正确反映文本值,但是这条只对标点符号字符有用;反斜杠(平时正常)的字母数字字符作用相反:它把该文本字符变成某些特殊的东西。不论什么时候你看到下面的双字符序列:

 

   \b \D \t \3 \s

你就应该知道这些序列是一个元符号,它们匹配某些特殊的东西。比如,\b 匹配一个字边界,而 \t 匹配一个普通水平制表字符。请注意一个水平制表符是一个字符宽,而一个字边界是零字符宽,因为它是两个字符之间的位置。所以我们管 \b 叫一个零宽度断言。当然,\t 和 \b 还是相似的,因为他们都断言某些和字串里的某个特殊位置相关的东西。当你在正则表达式里断言某些东西的时候,你的意思只是说,如果要匹配模式,那些东西必须是真的。

一个正则表达式里的大多数部分都是某种断言,包括那些普通字符,只不过它们是断言它们必须匹配自身。准确来说,它们还断言下一个东西将匹配字串里下一个字符,这也是为什么我们说水平制表符是“单字符宽”。有些断言(比如 \t)当匹配的时候就吞掉字串的一部分,而其他的(比如 \b)不会这样。但是通常我们把“断言”这个词保留给零宽度断言用。为避免混淆,我们把这些东西称做宽度为一个原子的东西。(如果你是一个物理学家,你可以把非零宽的原子当作物质,相比之下零宽断言类似无质量的光子。)

你还会看到有些元字符不是断言;而是结构元素(就好象花括弧和分号定义普通 Perl 代码的结构,但是实际上什么也不干)。这些结构元字符在某种程度上来说是最重要的元字符,因为学习阅读正则表达式关键的第一步就是让你的眼睛学会挑出结构元字符。一旦你学会了挑出结构元字符,阅读正则表达式就是如坐春风(注:当然,有时候风力强劲,但绝对不会把你刮跑。)

有一个结构元字符是竖直条,表示侯选项:

 

   /Frodo|Pippin|Merry|Sam/  (译注:电影“魔戒”里Shire的四个小矮人)

这意味着这些字串的任何一个都会触发匹配;这个内容在本章稍后的“侯选项”节描述。并且我们还会在那节后面的“捕获和集群”节里告诉你如何使用圆括弧,把你的模式各个部分括起来分组:

 

   /(Frodo|Drogo|Bilbo) Baggins/ (译注:Bilbo Baggins 是 Frodo 的叔叔,老一辈魔戒承载者。)

或者甚至:

 

   /(Frod|Drog|Bilb)o Baggins/

你看到的其他的东西是我们称之为量词的东西,它表示在一行里面前面匹配的东西应该匹配几个。量词是这些东西:

 

   * + ? *? {3} {2,5}

不过你永远不会看到它们这样独立地存在。量词只有附着在原子后面才有意义 —— 也就是说,断言那些有宽度的(注:量词有点象第四章,语句和声明,里的语句修饰词,也是只能附着在单个语句后面。给一个零宽度的断言附着量词就象试图给一个声明语句附着一个 while 修饰词一样 —— 两种做法都和你跟药剂师要一斤光子一样无聊。药剂师只卖原子什么的。)量词只附着在前一个原子上,从我们人类的眼光来看,这通常量化为只有一个字符。如果你想匹配一行里的三个“bar”的副本,你得用圆括弧把“bar”的三个独立的字符组合成一个“分子”,象这样:

 

   /(bar){3}/

这样将和“barbarbar”匹配。如果你用的是 /bar{3}/,那么匹配的是“barrr“ —— 这东西表明你是苏格兰人(译注:爱尔兰人说英文的时候尾音比较长),而不是 barbarbar 人。(话又说回来,也可能不是。我们有些很喜欢的元字符就是爱尔兰人。)有关量词的更多东西,参阅后面的“量词”。

你已经看到了一些继承了正则表达式的野兽,现在一定迫不及待地想驯服它们。不过,在我们开始认真地讨论正则表达式之前,我们需要先向回追溯一些然后再谈谈使用正则表达式的模式匹配操作符。(并且如果你在学习过程中碰巧多遇到几只“野兽”,那么不妨给我们的学习向导留一条不错的技巧。)

 

5.2 模式匹配操作符

从动物学角度来说,Perl 的模式匹配操作符函数是某种用来关正则表达式的笼子。我们是有意这么设计的;如果我们任由正则怪兽在语言里四处乱逛,Perl 就完全是一个原始丛林了。当然,世界需要丛林——它们是生物种类多样性的引擎,但是,丛林毕竟应该放在它们应该在的位置。一样,尽管也是组合多样化的引擎,正则表达式也应该放在它们应该在的模式匹配操作符里面。那里是另外一个丛林。

因为正则表达式还不够强大,m// 和 s/// 操作符还提供了(同样也是限制)双引号代换的能力。因为模式是按照类似双引号字串那样分析的,所以所有的双引号代换都有效,包括变量代换(除非你用单引号做分隔符)和用反斜杠逃逸标识的特殊字符。(参阅本章后面的"特殊字符"。)在字串被解释成正则表达式之前首先应用这些代换。(也是 Perl 语言里极少数的几个地方之一,在这些地方一个字串要经过多于一次处理。)第一次处理是不那么正常的双引号代换,不正常是因为它知道它应该转换什么和它应该给正则表达式分析器传递什么。因此,任何后面紧跟竖直条,闭圆括弧或者字符串结尾的 $ 都不会被当作变量代换,而是当作典型的正则表达式的行尾断言。所以,如果你说:

 

   $foo = "bar";
   /$foo$/;

双引号代换过程是知道那两个 $ 符作用是不同的。它先做 $foo 的变量代换,然后把剩下的交给正则表达式分析器:

 

   /bar$/;

这种两回合分析的另一个结果是普通的 Perl 记号分析器首先查找正则表达式的结尾,就好象它在查找一个普通字串的结尾分隔符一样。只有在它找到字串的结尾后(并且完成任意变量代换),该模式才被当作正则表达式对待。这意味着你无法在一个正则构造里面“隐藏”模式的结尾分隔符(比如一个字符表或者一个正则注释,我们还没有提到这些东西)。Perl 总是会在任何地方识别该分隔符并且在该处结束该模式。

你还应该知道在模式里面代换变量会降低模式匹配的速度,因为它会觉得需要检查变量是否曾经变化过,如果变化过,那么它必须重新编译模式(这样更会降低速度)。参阅本章后面的“变量代换”。

tr/// 转换操作符不做变量代换;它甚至连正则表达式都不用!(实际上,它可能并不属于本章,但我们实在想不出更好的地方放它。)不过,它在一个方面还是和 m// 和 s/// 一样的:它用 =~ 和 !~ 操作符与变量绑定。

第三章,单目和双目操作符,里描述的 =~ 和 !~ 操作符把它们左边的标量表达式和在右边的三个引起类操作符之一绑定在一起: m// 用于匹配一个模式,s/// 用于将某个符合模式的子字串代换为某个字串,而 tr/// (或者其同义词,y///)用于将一套字符转换成另一套。(如果把斜杠用做分隔符,你可以把 m// 写成 //,不用写 m。)如果 =~ 或 !~ 的右手边不是上面三个,它仍然当作是 m// 匹配操作,不过此时你已经没有地方放跟在后面的修饰词了(参阅后面的“模式修饰词”),并且你必须操作自己的引号包围:

 

   print "matches"   if   $somestring =~ $somepattern;

不过,我们实在没道理不明确地说出来:

 

   print "matches" if   $somestring =~ m/$somepattern/;

当用于匹配操作时,有时候 =~ 和 !~ 分别读做“匹配”和“不匹配”(因为“包含”和“不包含”会让人觉得有点模糊)。

除了在 m// 和 s/// 操作符里使用外,在 Perl 的另外两个地方也使用正则表达式。split 函数的第一个参数是一个特殊的匹配操作符,它声明的是当把字串分解成多个子字串后不返回什么东西。参阅第二十九章,函数,里的关于 split 的描述和例子。qr// (“引起正则表达”)操作符同样也通过正则表达式声明一个模式,但是它不是为了匹配匹配任何东西(和 m// 做的不一样)。相反,编译好的正则表达的形式返回后用于将来的处理。参阅“变量代换”获取更多信息。

你用 m//,s/// 或者 tr/// 操作符和 =~ (从语言学上来说,它不是真正的操作符,只是某种形式的标题符)绑定操作符把某一字串和这些操作符之一绑定起来。下面是一些例子:

 

   $haystack =~ m/meedle/         # 匹配一个简单模式
   $haystack =~ /needle/         # 一样的东西
   
   $italiano =~ s/butter/olive oil/   # 一个健康的替换
   
   $rotate13 =~ tr/a-zA-Z/n-za-mN-ZA-M/   # 简单的加密

如果没有绑定操作符,隐含地用 $_ 做“标题”:

 

   /new life/ and            # 搜索 $_ 和 (如果找到)
   /new civilizations/      # 再次更宽范围地搜索 $_

   s/sugar/aspartame/         # 把一个替换物替换到 $_ 里

   tr/ATCG/TAGC            # 修改在 $_ 里表示的DNA

因为 s/// 和 tr/// 修改它们所处理的标量,因此你只能把它们用于有效的左值:

 

   "onshore" =~ s/on/off/;         # 错;编译时错误

不过,m// 可以应用于任何标量表达式的结果:

 

   if (( lc $magic_hat->fetch_contents->as_string) =! /rabbit/) {
      print  "Nyaa, what's up doc?\n";
   }
   else {
      print "That trick never works!\n";
   }

但是,在这里你得更小心一些,因为 =~ 和 !~ 的优先级相当高——在前一个例子里,左边的项的圆括弧是必须的(注:如果没有圆括弧,低优先级的 lc 将会应用于整个模式匹配而不只是对 magic hat 对象的方法调用。)。!~ 绑定操作符作用和 =~ 类似,只是把逻辑结果取反:

 

   if ($song !~ /words/) {
      print qq/"$song" appears to be a song without words. \n/;
   }

因为 m//,s///,和 tr/// 都是引号包围操作符,所以你可以选择自己的分隔符。这时其运行方式和引起操作符 q//,qq//,qr//,和 qw//一样(参阅第二章,集腋成裘,中的“选择自己的引号”)。

 

   $path =~ s#/tmp#/var/tmp/scratch#;

   if ($dir =~ m[/bin]) {
      print "No binary directories please.\n";
   }

当你把成对的分隔符和 s/// 或者 tr/// 用在一起的时候,如果第一部分是四种客户化的括弧对之一(尖括弧,圆括弧,方括弧或者花括弧),那么你可以为第二部分选用不同于第一部分的分隔符:

 

   s(egg)<larva>;
   s{larva}{pupa};
   s[pupa]/imago/;

也可以在实际使用的分隔符前面加空白字符:

 

   s (egg) <larva>;
   s {larva}   {pupa};
   s [pupa]   /imago/;

每次成功匹配了一个模式(包括替换中的模式),操作符都会把变量 $`,$&,和 $' 分别设置为匹配内容左边内容,匹配的内容和匹配内容的右边的文本。这个功能对于把字串分解为组件很有用:

 

"hot cross buns" =~ /cross/;
print "Matched: <$`> $& <$'>\n";    # Matched: <hot > cross < buns>
print "Left:    <$`>\n";            # Left:    <hot >
print "Match:   <$&>\n";            # Match:   <cross>
print "Right:   <$'>\n";            # Right:   < buns>

为了有更好的颗粒度和提高效率,你可以用圆括弧捕捉你特别想分离出来的部分。每对圆括弧捕捉与圆括弧内的模式相匹配的子模式。圆括弧由左圆括弧的位置从左到右依次排序;对应那些子模式的子字串在匹配之后可以通过顺序的变量 $1,$2,$3 等等获得:

 

   $_ = "Bilbo Baggins's birthday is September 22";
   /(.*)'s birthday is (.*)/;
   print "Person: $1\n";
   print "Date: $2\n";

$`, $&, $' 和排序的变量都是全局变量,它们隐含地局部化为属于此闭合的动态范围。它们的存在直到下一次成功的匹配或者当前范围的结尾,以先到者为准。我们稍后在其它课题里有关于这方面内容里更多介绍。

一旦 Perl 认为你的程序的任意部分需要 $`, $&, 或 $',它就会为每次模式匹配提供这些东西。这样做会微微减慢你的程序的速度。Perl 同样还利用类似的机制生成 $1,$2 等等,因此你也会为每个包含捕捉圆括弧的模式付出一些代价。(参阅“集群”获取在保留分组的特征的同时避免捕获的开销的方法。)但如果你从不使用 $`,$& 或者 $',那么不带捕获圆括弧的模式不会有性能损失。因此,如果可能地话,通常你应该避免使用 $`,$& 和 $',尤其是在库模块里。但是如果你必须至少使用它们一次(而且有些算法的确因此获益非浅),那么你就随便用它们吧,因为你已经为之付出代价了。在最近的 Perl 版本里,$& 比另外两个开销少。

 

5.2.1 模式修饰词

我们稍后将逐个讨论模式匹配操作符,但首先我们先谈谈另一个这些模式操作符都有的共性:修饰词。

你可以在一个 m//,s///,qr//,或者 tr/// 操作符的最后一个分隔符后面,以任意顺序放一个或多个单字母修饰词。为了保持清晰,修饰词通常写成“/o 修饰词”并且读做“斜杠 o 修饰词”),即使最后的分隔符可能不是一个斜杠也这么叫。(有时候人们把“修饰词”叫做“标志”或者“选项”也可以。)

有些修饰词改变单个操作符的特性,因此我们将在后面仔细讨论它们。其他的修改正则表达式的解释方式,所以我们在这里讨论它们。m//,s/// 和 qr// 操作符(tr/// 操作符并不接受正则表达式,所以这些修饰词并不适用。)的最后一个分隔符后面都接受下列修饰词:

 

修饰词含义
/i忽略字母的大小写(大小写无关)
/s令 . 匹配换行符并且忽略不建议使用的 $* 变量
/m令 ^ 和 $ 匹配下一个嵌入的 \n。
/x忽略(大多数)空白并且允许模式中的注释
/o只编译模式一次

/i 修饰词是说同时匹配大写或者小写(以及在 Unicode 里的标题)。也是为什么/perl/i 将匹配字串 "PROPERLY" 或 "perlaceous"(几乎是完全不同的东西)。use locale 用法可能也会对被当作相同的东西有影响。(这可能对包含 Unicode 的字串有负面影响。)

/s 和 /m 修饰词并不涉及任何古怪的东西。它们只是影响 Perl 对待那些包含换行符的匹配的态度。不过它们和你的字串是否包含换行符无关;它们关心的是 Perl 是否应该假设你的字串包含单个行(/s)还是多个行(/m),因为有些元字符根据你是否需要让它们工作于面向行的模式而有不同的行为。

通常,元字符 "." 匹配除了换行符以外的任何单个字符,因为它的传统含义是匹配一行内的某个字符。不过,带有 /s 时,"." 元字符也可以匹配一个换行符,因为你已经告诉 Perl 忽略该字串可能包含多个换行符的情况。 (/s 修饰词同样还令 Perl 忽略我们已经不鼓励使用的 $* 变量,我们也希望你也忽略。)另一方面,/m 修饰词还修改元字符 ^ 和 $ 的解释 —— 通过令它们匹配字串里的换行符后面的东西,而不仅仅是字串的结尾。参阅本章的”位置“节的例子。

/o 操作符控制模式的重新编译。除非你选用的分隔符是单引号(m'PATTERN',s'PATTERN'REPLACEMENT',或者 qr'PATTERN'),否则每次计算模式操作符的时候,任何模式里的变量都会被代换(并且可能会导致模式的重新编译)。如果你希望这样的模式被且只被编译一次;那么就该使用 /o 修饰词。这么做可以避免开销巨大的运行时重新编译;这么做非常有用,尤其是你在转换的值在执行中不会改变的情况下。不过,/o 实际上是让你做出了不会改变模式中的变量的承诺。如果你改变了这些变量,Perl 设置都不会注意到。为了更好地控制重编译,你可以使用 qr// 正则表达式引起操作符。详情请参阅本章后面的“变量代换”节。

/x 是表达修饰词:它允许你利用空白和解释性注释扩展你的模式的易读性,你甚至还可以把模式扩展得超过一行的范围。

也就是说,/x 修改空白字符(还有 # 字符)的含义:它们不再是普通字符那样的自匹配字符,而是转换成元字符,这些元字符的特征类似空白(和注释字符)。因此,/x 允许(在模式里面)将空白,水平制表符和换行符用于格式化,就象普通 Perl 代码一样。它还允许用通常在模式里没有特殊含义的 # 字符引入延伸到当前模式行行尾的注释。(注:请注意不要在注释里包含模式分隔符——因为“先找结尾”的规则,Perl 没办法知道你在该点上并不想结束。)如果你想匹配一个真正的空白字符(或者 # 字符),那你就要把它们放到字符表里,或者用反斜杠逃逸,或者用八进制或者十六进制逃逸的编码。(但是空白通常用一个 \s* 或 \s+ 序列匹配,因此实际中这种情况出现得并不多。)

总结而言,这些特性朝着把传统的正则表达式变成更可读的语言迈进了一大步。从"回字有四种写法"精神出发,现在写一个正则表达式的方法是不止一种了。实际上,我们有不止两种的方法:(译注:TMTOWTDI:"There's More Then One Way To Do It", "做事的方法不止一种". Perl 文化口号,见本书尾部的词汇表.)

 

   m/\w+:(\s+\w+)\s*\d+/;      # 一个词,冒号,空白,词,空白,数字。
   m/\w+: (\s+ \w+) \s* \d+/x;   # 一个词,冒号,空白,词,空白,数字。

   m{
      \w+:         # 匹配一个词和一个冒号。
      (         # 分组开始。
         \s+      # 匹配一个或多个空白。
         \w+      # 匹配另外一个词。
      )         # 分组结束。
      \s*         # 匹配零或更多空白。
      \d+         # 匹配一些数字
   }x;

我们会在本章稍后描述这些元符号。(本节本来是讲模式修饰词的,但是我们却因为对 /x 过于兴奋而超出了我们的控制。)下面是一个正则表达式,它找出一个段落里面的重复的词,我们从 Perl Cookbook 里直接把这个例子偷了出来。它使用 /x 和 /i 修饰词,以及后面描述的 /g 修饰词。

 

   # 找出段落里面的重复的单词,可能会跨越行界限。
   # 将 /x 用于空白和注释,/i 以匹配在"Is is this ok?"里的两个`is'
   # 用 /g 找出所有重复。

   $/ = "";      # "paragrep" 模式
   while( <> ) {
      while ( m{
            \b         # 从字边界开始
            (\w\S+)         # 找出一个字块
            (
               \s+      # 由一些空白分隔
               \l      # 然后再次分块
            )+         # 重复动作
            \b         # 直到另外一个字边界
         }xig
      )
      {
         print "dup word '$1' at paragraph $.\n";
      }
   }

当对本章运行这个程序时,它的输出象下面这样:

dup word 'that' at paragraph 100 (译注:只对英文原版有效 :))

看到这些,我们就知道这个重复是我们有意做的。

 

 

5.2.2 m// 操作符(匹配)

 

   EXPR =~ m/PATTERN/cgimosx
   EXPR =~ /PATTERN/cgimosx
   EXPR =~ ?PATERN?cgimosx
   m/PATTERN/cgimosx
   /PATTERN/cgimosx
   ?PATTERN?cgimosx

m// 操作符搜索标量 EXPR 里面的字串,查找 PATTERN。如果使用 / 或 ? 做分隔符,那么开头的 m 是可选的。? 和 ' 做分隔符时都有特殊含义:前者表示只匹配一次;后者禁止进行变量代换和六种转换逃逸(\U 等,后面描述)。

如果 PATTERN 计算出的结果是空字串,则要么是你用 // 把它声明成空字串或者是因为一个代换过来的变量就是空字串,这时就用没有隐藏在内层块(或者一个 split,grep,或者 map)里的最后执行成功的正则表达式替代。

在标量环境里,该操作符在成功时返回真(1),失败时返回假("")。这种形式常见于布尔环境:

 

   if($shire =~ m/Baggins/) { ...}   # 在 $shire 里找Baggins,译注:shire 知道哪里么?;)
   if($shire =~ /Baggins/)   { ...}   # 在 $shire 里找Baggins
   
   if(m#Baggins#)      {...}   # 在 $_ 里找
   if( /Baggins/ )      {...}    # 在 $_ 里找

在列表环境里使用,m// 返回一个子字串的列表,这些子字串匹配模式里的捕获圆括弧(也就是 $1,$2,$3 等等),这些捕获圆括弧将在稍后的“捕获和集群”里描述。当列表返回的时候,这些序列数变量仍然是平滑的。如果在列表环境里匹配失败,则返回一个空列表。如果在列表环境中匹配成功,但是没有使用捕获圆括弧(也没有 /g),则返回则返回一列 (1)。因此它在失败时返回一列空列表,所以这种形式的 m// 仍然能用于布尔环境,但是仅限于通过列表赋值间接参与的情况:

 

   if( ($key, $values) = /(\w+): (.*)/) { ... }

用于 m//(不管是什么形式)的合法修饰词见表 5-1。

表 5-1。 m// 修饰词

 

修饰词含义
/i或略字母大小写
/m令 ^ 和 $ 匹配随后嵌入的 \n。
/s令 . 匹配换行符并且忽略废弃了的 $*。
/x或略(大多数)空白并且允许在模式里的注释
/o只编译模式一次
/g全局地查找所有匹配
/cg在 /g 匹配失败后允许继续查找

 

头五个用于正则表达式的修饰词我们前面描述过了。后面两个修改匹配操作本身的特性。/g 修饰词声明一个全局匹配——也就是说,在该字串里匹配尽可能多的次数。它的具体特性取决于环境。在列表环境里,m//g 返回所有找到的东西的列表。下面的语句找出所有我们提到的 "perl", "Perl","PERL" 的地方:

 

   if( @perls = $paragrapth =~ /perl/gi) {
      printf "Perl mentioned %d times.\n", scalar @perls;
   }

如果在 /g 模式里没有捕获圆括弧,那么返回完整的匹配。如果有捕获圆括弧,那么返回捕获到的字串。想象一下这样的字串:

 

   $string = "password=xyzzy verbose=9 score=0";

并且假设你想用这个字串初始化下面这样的散列:

 

   %hash = (password => "xyzzy", verbose => 9, socre => 0);

当然,你有字串但还没有列表。要获取对应的列表,你可以在列表环境里用 m//g 操作符,从字串里捕获所有的键/值对:

 

   %hash = $string =~ /(\w+)=(\w+)/g;

(\w+) 序列捕获一个字母数字单词。参阅“捕获和集群”节。

在标量环境里使用时,/g 修饰词表明一次渐进地匹配,它令 Perl 从上一次匹配停下来的位置开始一次对同一个变量的新的匹配。\G 断言表示字符串中的那个位置;\G 的描述请参阅本章后面的“位置”一节。如果除了用 /g,你还用了 /c(表示“连续”)修饰词,那么当 /g 运行结束后,失败的匹配不会重置位置指针。

如果分隔符是 ?,就象 ?PATTERN?,那么运行起来和 /PATTERN/ 搜索一样,区别是它在两次 reset 操作符调用之间只匹配一次。如果你只想匹配程序运行中模式出现的第一次,而不是所有的出现,那么这是一个很方便的优化方法。你每次调用此操作符时都会运行搜索,直到它最终匹配了什么东西,然后它就关闭自身,在你明确地用 reset 把它重置之前它一直返回假。Perl 替你跟踪这个匹配状态。

当一个普通模式匹配想找出最后一个匹配而不是第一个,那么 ?? 操作符很好用:

 

   open DICT, "/usr/dict/words" or die "Can't open words: $!\n";
   while (<DICT>) {
      $first = $1 if ?(^neur.*)?;
      $last = $1 if /(^neur.*)/;
   }
   print $first, "\n";      # 打印"neurad"
   print $last, "\n";      # 打印 "neurypnology"

在调用 reset 操作符时,reset 只重置那些编译进同一个包的 ?? 记录。你说 m?? 的时候等效于说 ??。

 

5.2.3 s/// 操作符(替换)

 

   LVALUE =~ s/PATTERN/REPLACEMENT/egimosx
   s/PATTERN/REPLACEMENT/egimosx

这个操作符在字串里搜索 PATTERN,如果找到,则用 REPLACEMENT 文本替换匹配的子字符串。(修饰词在本节稍后描述。)

 

   $lotr = $hobbit;      # 只是拷贝Hobbit 译注:影片魔戒里,Hobbit 人住在 Shire :)
   $lotr =~ s/Bilbo/Frodo/g;   # 然后用最简单的方法写结局,译注:Frodo 代替 Bilbo 成了魔戒的看护人,又是魔戒

一个 s/// 操作符的返回值(在标量和列表环境里都差不多)是它成功的次数(如果与 /g 修饰词一起使用,返回值可能大于一)。如果失败,因为它替换了零次,所以它返回假(""),它等效于数字 0。

 

   if( $lotr =~ s/Bilbo/Frodo/) { print "Successfully wrote sequel." }
   $change_count = $lotr =~ s/Bilbo/Frodo/g;

替换部分被当作双引号包围的字串看待。你可以在替换字串里使用我们前面描述过的任何动态范围的模式变量($`,$&,$',$1,$2,等等),以及任何其他你准备使用的双引号包围的小发明。比如下面是一个小例子,用于找出所有字串 "revision","version",或者 "release",并且用对应的大写字串替换,我们可以用 \u 逃逸处理替换的目标部分:

 

   s/revision|version|release/\u$&/g;   # | 用于表示模式中的“或”

所有的标量变量都在双引号包围的环境中扩展开,而不仅仅是这些特殊的变量。假设你有一个散列 %Names,把版本号映射为内部的项目名;比如,$Name{"3.0"} 可能是名为 "Isengard" 的代码名。你可以用 s/// 找出版本号并且用它们对应的项目名替换掉:

 

   s/version ([0-9.]+)/the $Names{$1} release/g;

在在替换字串里,$1 返回第一对(也是唯一的一对)捕获圆括弧。(愿意的话你还可以在模式里用 \1,但是这个用法在替换中已经废弃了,在一个普通的双引号包围的字串里,\1 的意思是 Control-A。)

如果 PATTERN 是一个空字串,则使用上一次成功执行的正则表达式取代。PATTERN 和RELPACEMENT 都需要经受变量代换,不过每次计算 s/// 操作符的时候都进行代换,而 REPLACEMENT 只是在有匹配的时候才做变量代换。(如果你使用了 /g 修饰词,那么 PATTERN 在一次计算中可能匹配多次。)

和前面一样,表 5-2 中的头五个修饰词修改正则表达式的性质;他们与 m// 和 qr// 中的一样。后面两个修改替换操作符本身。

表 5-2 s/// 修饰词

 

修饰词含义
/i或略字母大小写
/m令 ^ 和 $ 匹配随后嵌入的 \n。
/s令 . 匹配换行符并且忽略废弃了的 $*。
/x或略(大多数)空白并且允许在模式里的注释
/o只编译模式一次
/g全局地查找所有匹配
/e把右边当作一个表达式计算

 

/g 修饰词用于 s/// 的时候就会把每个匹配 PATTERN 的东西用 REPLACEMENT 值替换,而不仅仅是所找到的第一个。一个 s///g 操作符的作用象一次全局的搜索和替换,令所有修改同时发生,很象 m//g,只不过 m//g 不改变任何东西。(而且 s///g 也和标量 m//g 不一样,它不是递增匹配。)

 

/e 修饰词把 REPLACEMENT 当作一个 Perl 代码块,而不仅仅是一个替换的字串。执行这段代码后得出的结果当作替换字串使用。比如,s/(0-9)+)/sprintf("%#x", $1)/ge 将把所有数字转换成十六进制,比如,把 2581 变成 0xb23。或者,假设在我们前一个例子里,你不知道是否所有版本都有名称,因此,你希望把这些没有名称的保留不动。可以利用稍微有点创造力的 /x 格式,你可以说:

 

   s{
      version
      \s+
      (
         [0-9.]+
      )
   }{
      $Names{$1}
         ? "the $Names[$1} release"
         : $&
   }xge;

你的 s///e 的右边(或者本例中的下半部分)在编译时与你的程序的其他部分一起做语法检查和编译。在编译过程中,任何语法错误都会被检测到,而运行时例外则被忽略。在第一个 /e 后面每多一个 e(象 /ee,/eee 等等)都等效于对生成的代码调用 eval STRING,每个 /e 相当于一次调用。这么做等于计算了代码表达式的结果并且把例外俘获在特殊变量 $@ 里。参阅本章后面的“编程化模式”获取更多信息。

 

5.2.3.1 顺便修改一下字串

有时候你想要一个新的,修改过的字串,而不是在旧字串上一阵乱改,新字串以旧字串为基础。你不用写:

 

   $lotr = $hobbit;
   $lotr =~ s/Bilbo/Frodo/g;

你可以把这些组合成一个语句。因为优先级关系,必须在赋值周围使用圆括弧,因为它们大多和使用了 =~ 的表达式结合在一起。

 

   ($lotr = $hobbit ) =~ s/Bilbo/Frodo/g;

如果没有赋值语句周围的圆括弧,你只修改了 $hobbit 并且把替换的个数存储在 $lotr里,那样会得到很傻的结局。

你不能对数组直接使用 s/// 操作符。这时,你需要一个循环。幸运的是,for/foreach 的别名特性加上它把 $_ 当作缺省循环变量,这样就产生了 Perl 标准的用于搜索和替换一个数组里每个元素的俗语:

 

   for (@chapters) { s/Bilbo/Frodo/g }      # 一章一章的替换
   s/bilbo/Frodo/g for @chapters;         # 一样的东西

就象一个简单的标量变量一样,如果你想把初始的值保留在其他地方,你也可以把替换和赋值结合在一起:

 

   @oldhues = ('bluebird', 'bluegrass', 'bluefish', 'the blues');
   for (@newhues = @oldhues) { s/blue/red/}
   print "@newhues\n";      # 打印:redbird redgrass redfish the reds

对同一个变量执行重复替换的最经典的方法是用一个单程循环。比如,下面是规范变量里的空白的方法:

 

   for ($string) {
      s/^\s+//;   # 丢弃开头的空白
      s/\s+$//;   # 丢弃结尾的空白
      s/\s+/ /g;   # 压缩内部的空白
   }

这个方法正好和下面的是一样的:

 

   $string = join(" ", split " ", $string);

你还可以把这样的循环和赋值用在一起,就象我们在数组的例子里做的那样:

 

   for( $newshow = $oldshow ) {
      s/Fred/Homer/g;
      s/Wilma/Marge/g;
      s/Pebbles/Lisa/g;
      s/Dino/Bart/g;
   }

 

5.2.3.2 当全局替换不够“全局”地时候

 

有时候,你用 /g 不能实现全部修改的发生,这时要么是因为替换是从右向左发生的,要么是因为你要求 $` 的长度在不同的匹配之间改变。通常你可以通过反复调用 s/// 做你想做的事情。不过,通常你希望当 s/// 失败的时候循环停下来,因此你必须把它放进条件里,这样又让循环的主体无所事事。因此我们只写一个 1,这也是一件无聊的事情,不过有时候无聊比没希望好。下面是一些例子,它们又用了一些正则表达式怪兽:

 

   # 把逗号放在一个整数的合理的位置
   1 while s/(\d)(\d\d\d)(?!\d)/$1,$2/;

   # 把水平制表符扩展为八列空间
   1 while s/\t+/' ' x (length($&)*8 - length($`)%8)/e;

   # 删除 (嵌套(甚至深层嵌套(象这样)))的括弧
   1 while s/\([^()]*\)//g;

   # 删除重复的单词(以及三重的(和四重的。。。))
   1 while s/\b(\w+) \1\b/$1/gi;

最后一个需要一个循环是因为如果没有循环,它会把:

 

   Paris in THE THE THE THE spring.

转换成:

 

   Paris in THE THE spring。

这看起来会让那些懂点法文的人觉得巴黎位于一个喷冰茶的喷泉中间,因为"the"(法文)是法文“tea”的单词。当然,巴黎人从来不会上当。

 

5.2.4 tr/// 操作符(转换)

 

   LVALUE =~ tr/SEARCHLIST/REPLACEMENTLIST/cds
   tr/SEARCHLIST/REPLACEMENTLIST/cds

对于 sed 的爱好者而言,y/// 就是 tr/// 的同义词。这就是为什么你不能调用名为 y 的函数,同样也不能调用名为 q 或 m 的函数。在所有的其他方面,y/// 都等效于 tr///,并且我们不会再提及它。

把这个操作符放进关于模式匹配的章节看起来其实有点不合适,因为它不使用模式。这个操作符逐字符地扫描一个字串,然后把每个在 SEARCHLIST (不是正则表达式)里出现的字符替换成对应的来自 REPLACEMENTLIST(也不是替换字串)的字符。但是它看上去象 m// 和 s///,你甚至还可以和它一起使用 =~ 和 !~ 绑定操作符,因此我们在这里描述它。(qr// 和 split 都是模式匹配操作符,但是它们不能和绑定操作符一起使用,因此因此在我们本书的别处描述它们。自己找找看。)

转换返回替换或者删除了的字符个数。如果没有通过 =~ 或者 !~ 操作符声明的字串,那么使用 $_ 字串。SEARCHLIST 和 REPLACEMENTLIST 可以用一个划线定义一个顺序字符的范围:

 

   $message =~ tr/A-Za-z/N-ZA-Mn-za-m?;   # 旋转13加密

请注意想 A-Z 这样的范围假设你用的是线性字符集,比如 ASCII。但是不同的字符集的字符排列顺序是不一样的。一个合理的原则是,只使用起始点都是相同大小写的字母序列,如 (a-e,A-E),或者数字 (0-4)。任何其他的范围都有问题。如果觉得有问题,他们写成你用的整个字符集:ABCDE。

SEARCHLIST 和 REPLACEMENTLIST 都不会象双引号字串那样进行变量代换;不过,你可以使用那些映射为特殊字符的反斜杠序列,比如 \n 或 \015。

表 5-3 是可用于 tr/// 操作符的修饰词。它们和用于 m//,s///,或 qr// 上的完全不同,即使有些看起来有点象。

表 5-3。tr/// 修饰词

 

修饰词含义
/c与SEARCHLIST为补
/d删除找到的但是没有替换的字符
/s消除重复的字符。

 

如果声明了 /c 修饰词,那么 SEARCHLIST 里的字符会被求补;也就是说,实际的搜索列表包含所有不在 SEARCHLIST 里的字符。如果是 Unicode,这样可能会代表许多字符,不过因为它们是逻辑存储的,而不是物理存储,所以你不用害怕会用光内存。

/d 修饰词把 tr/// 转换成所谓的“过滤吸收”操作符:任何由 SEARCHLIST 声明的但是没有在 RELPACEMENTLIST 里给出替换的字符将被删除。(这样比一些 tr(1) 程序的性质显得更加灵活,那些程序删除它们在 SERACHLIST 里找到的任何东西。)

如果声明了 /s 修饰词,被转换成相同字符的顺序字符将被压缩成单个字符。

如果使用了 /d 修饰词,那么 RELPACEMENTLIST 总是严格地解释成声明的样子。否则,如果 REPLACEMENTLIST 比 SEARCHLIST 短,则复制 REPLACEMENTLIST 的最后一个字符,直到足够长为止。如果 RELPACEMENTLIST 为空,则复制 SEARCHLIST,这一点虽然奇怪,但很有用,尤其是当你只是想计算字符数,而不是改变它们的时候。也有利于用 /s 压缩 字符。

 

   tr/aeiou/!/;         # 把所有元音字母转换成!
   tr{/\\\r\n\b\f. }{_};      # 把怪字符转成下划线

   tr/A-Z/a-z/ for @ARGV;      # 把字符规则化为小写ASCII

   $count = ($para =~ tr/\n//);   # 计算$para里的换行符
   $count = tr/0-9//;      # 计算$_里的位

   $word =~ tr/a-zA-Z//s;      # bookkeeper -> bokeper

   tr/@$%*//d;         # 删除这里几个字符
   tr#A-Za-z0-9+/##cd;      # 删除非base64字符

   # 顺便修改
   ($HOST = $host) =~ tr/a-z/A-Z/;

   $pathname =~ tr/a-zA-Z/_/cs;   # 把非ASCII字母换成下划线

   tr [\200-\377]
      {\000-\177];         # 剥除第八位,字节操作

如果在 SEARCHLIST 里同一个字符出现的次数多于一次,那么只有第一个有效。因此:

 

   tr/AAA/XYZ/

将只会把($_ 里的)任何单个字符 A 转换成 X。

尽管变量不会代换进入 tr///,但是你还是可以用 eval EXPR 实现同样效果:

 

   $count = eval "tr/$oldlist/$newlist/";
   die if $@;   # 传播非法eval内容的例外

最后一条信息:如果你想把你的文本转换为大写或者小写,不要用 tr///。用双引号里的 \U 或者 \L 序列(或者等效的 uc 和 lc 函数),因为它们会关心区域设置或 Unicode 信息,而 tr/a-z/A-Z/ 不关心这些。另外在 Unicode 字串里,\u 序列和它的对应 ucfirst 函数能够识别标题格式,对某些语言来说,比简单地转换成大写更突出。

 

5.3 元字符和元符号

既然我们尊重这些神奇的笼子,那么我们就可以回过头来看看笼子里的动物了,也就是那些你放在模式里好看的符号。到现在你应该已经看到这样的事实,就是这些符号并不是普通的函数调用或者算术操作符那样的 Perl 代码。正则表达式本身就是嵌入 Perl 的小型语言。(在现实社会里总是有小丛林。)

Perl 里的模式识别所有的 12 个传统的元字符(所谓十二烂人),以及它们的所有潜能和表现力。许多其他正则表达式包里也能看到它们:

 

   \ | () [ { ^ $ * + ? .

它们中有些曲解规则,令跟在它们后面本来正常的字符变成特殊的。我们不喜欢把长序列叫做“字符”,因此,如果它们组成长序列后,我们叫它们元符号(有时候干脆就叫“符号”)。但是在顶级,这十二个元字符就是你(和 Perl)需要考虑的所有内容。任何东西都是从这里开始的。

有些简单的元字符就代表它们自己,象 . 和 ^ 和 $。它们并不直接影响它们周围的任何东西。有些元字符运行起来象前缀操作符,控制任何跟在后面的东西,象反斜杠 “\” 。其他的则像后缀操作符,控制紧排在它们前面的东西,像 *,+,和 ?。有一个元字符:|,其作用象中缀操作符,站在它控制的操作数中间。甚至还有括弧操作符,作用类似包围操作符,控制一些被它 包围的东西,像 (...) 和 [...]。圆括弧尤其重要,因为它们在内部声明 | 的范围,而在外部声明 *,+ 和 ? 的范围。

如果你只学习十二个元字符中的一个,那么选反斜杠。(恩。。。还有圆括弧)这是因为反斜杠令其他元字符失效。如果在一个 Perl 模式里,一个反斜杠放在一个非字母数字字符前,这样就让下一个字符成为一个字面的文本。如果你象在一个模式文本里匹配十二个元字符中的任何一个,你可以在它们前面写一个反斜杠。因此,\. 匹配一个真正的点,\$ 匹配真正的美圆符,\\ 是一个真正的反斜杠等等。这样做被称做“逃逸”元字符,或曰“引号包围之”,或者有时候就叫做“反斜杠某”。(当然,你已经知道反斜杠可以用于禁止在双引号字串里进行变量代换。)

虽然一个反斜杠把一个元字符转换成一个文本字符,它对后继的字母数字字符的作用却是完全另一码事。它把本来普通的东西变特别。也就是说,它们在一起形成元字符。我们在表 5-7 里给出了一个按字母排序的元字符表。

 

 

5.3.1 元字符表

 

符号原子性含义
\...变化反逃逸下一个非字母数字字符,转意下一个字母数字(可能)
...|...可选(匹配前者或者后者)。
(...)分组(当作单元对待)。
[...]字符表(匹配一个集合中的一个字符)。
如果在字串开头则为真(或者可能是在任何换行符后面。)
.匹配一个字符(通常除了换行符以外)。
$在字串尾部时为真(或者可能是在任何换行符前面)。

 

至于量词,我们会在它们自己的节里详细描述。量词表示前导的原子(也就是说,单字符或者分组)应该匹配的次数。它们列在表 5-5 中。

表 5-5。 正则量词

 

量词原子性含义
*匹配 0 或者更多次数(最大)。
+匹配 或者更多次数(最大)。
?匹配 1 或者0次(最大)。
{COUNT}匹配COUNT 次
{MIN,}匹配至少MIN次(最大)。
{MIN,MAX}匹配至少MIN次但不超过MAX次(最大)
*?匹配0或者更多次(最小)
+?匹配1或者更多次(最小)
??匹配0或者1次(最小)
{MIN,}?匹配最多MIN次(最小)
{MIN,MAX}?匹配至少MIN次但不超过MAX次(最小)

最小量词会试图匹配在它的许可范围内的尽可能少的次数。最大量词会试图匹配在它的许可范围内的尽可能多的次数。比如, .+ 保证至少匹配字串的一个字符,但是如果有机会,它会匹配所有机会。这里的机会将在稍后的“小引擎的/能与不能/”节里讲。

你还会注意量词决不能量化。

我们想给新类型的元符号一个可以扩展的语法。因为我们只需要使用十二个元字符,所以我们选用原先被认为是非法正则的序列做任意语法扩展。这些元符号的形式都是 (?KEY...);也就是,一个开圆括弧后面跟着一个问号,然后是 KEY 和模式其余部分。KEY 字符表明它是哪种正则扩展。参阅表 5-6 看看正则扩展的一个列表。它们中大多数性质象列表,因为它们基于圆括弧,不过它们还是有附加含义。同样,只有原子可以量化,因为它们代表真正存在(潜在地)的东西。

表 5-6 扩展的正则序列

 

扩展原子性含义
(?#...)注释,抛弃
(?:...)只集群,不捕获的圆括弧
(?imsx-imsx)打开/关闭模式修饰词
(?imsx-imsx:...)集群圆括弧加修饰词
(?=...)如果前向查找断言成功,返回真
(?!...)如果前向查找断言失败,返回真
(?<=...) </td>如果前向查找断言成功,返回真
(?如果前向查找断言失败,返回真
(?>...)匹配未反向跟踪的子模式
(?{...})执行嵌入的Perl代码
(??{...})匹配来自嵌入Perl代码。
(?(...)......)匹配if-then-elase模式
(?(...)...)匹配if-then模式

最后,表 5-7 显示了所有你常用的字母数字元符号。(那些在变量代换回合处理过的符号在原子性列里用一个划线标记,因为引擎永远不会看到它们。)

表 5-7。字母数字正则元符号

 

符号原子性含义
\0匹配空字符(ASCII NUL)。
\NNN匹配给出八进制的字符,最大值为\377。
\n匹配前面第n个捕获字串(十进制)。
\a匹配警钟字符(BEL)。
\A如果在字串的开头为真
\b匹配退各字符(BS)。
\b在字边界为真
\B不在字边界时为真
\cX匹配控制字符 Control-x(\cZ,\c[,等)。
\C匹配一个字节(C字符),甚至在utf8中也如此(危险)
\d匹配任何数字字符
\D匹配任何非数字字符
\e匹配逃逸字符(ASCII ESC,不是反斜杠)。
\E——结束大小写(\L,\U)或者掩码(\Q)转换
\f匹配进页字符(FF)。
\G如果在前一个m//g的匹配结尾位置时为真
\l——只把下一个字符变成小写
\L——把\E以前的字母都变成小写
\n匹配换行符字符(通常是NL,但是在Mac上是CR)。
\N{NAME}匹配命名字符(\N{greek:Sigma})。
\p{PROP}匹配任何有命名属性的字符
\P{PROP}匹配任何没有命名属性的字符
\Q——引起(消元)直到\E前面的字符
\r匹配返回字符(通常是CR,但是在Mac上是NL)。
\s匹配任何空白字符。
\S匹配任何非空白字符。
\t匹配水平制表符(HT)。
\u——只把下一个字符变成标题首字符
\U——大写(不是标题首字符)\E 以前的字符。
\w匹配任何“字”字符(字母数字加"_" )。
\W匹配任何“非字”字符。
\x{abcd}匹配在十六进制中给出的字符。
\X匹配Unicode里的”组合字符序列“字串。
\z只有在字串结尾时为真
\Z在字串结尾或者在可选的换行符之前为真。

 

如果在 \p 和 \P 里的属性名字是一个字符,那么花括弧是可选的。如果 \x 里的十六进制数为两位或者更少,那么花括弧也是可选的。在 \N 里的花括弧决不能省略。

只有在含义中带“匹配。。。”或者“匹配任何。。。”字样的元符号才能够在字符表(方括弧)里面使用。也就是说,字符表仅限于包含特定的字符集,因此在字符表里面,你只能使用那些描述其他特定字符集的元符号,或者那些描述特定独立字符的元符号。当然,这些元符号也可以和其他非分类元符号一起在字符表外面用,不过,这里请注意 =b 是两只完全不同的怪兽:它在字符表内是退格字符,而在外边是一个字边界断言。

一个模式可以匹配的字符的数量和一个双引号字串可以替换的字符的数量有一些重叠。因为正则要经历两个回合,所以有时候应该由哪个回合处理一个给定的字符会显得有些混乱。如果出现混乱,这种字符的变量代换回合就推迟给正则表达式分析器。

但是只有当变量代换回合知道它正在分析一个正则的时候,它才能把变量代换推迟给正则分析器。你可以把正则表达式声明为普通的双引号包围字串,但这样你就必须遵循普通的双引号包围规则。任何前面碰巧映射为时间字符的元符号仍然生效,即使它们没有被推迟给正则分析器也如此。但是在普通的双引号里你不能使用任何其它的元符号(或者任何类似的构造,比如 `...`,qq(...),qx(...),或者等效的“此处”文档)。如果你想你的字串分析成一个正则表达式而不做任何匹配,你应该使用 qr// (引号构造正则)操作符。

请注意大小写和元引号包围转换逃逸(\U 和它的伙伴)必须在变量代换回合处理,因为这些元符号的用途就是影响变量代换。如果你用单引号禁止变量代换,那么你也不能获得转换逃逸。在任何单引号字串里,都不会进行变量或者转换逃逸(\U等)的扩展,在单号包围的的 m'...' 或者 qr'...' 操作符里也不会。甚至在你做代换的时候,如果这些转换逃逸是一个变量代换的结果,那么它们也会被忽略,因为这个时候他们想要影响变量代换已经太晚了。

尽管字符替换操作符不处理正则表达式,但是我们讨论过的任何匹配单个特定字符的元符号在 tr/// 操作中仍然可用。而其他的用不了(除了反斜杠以外,它继续按照它原来的样子运转。)

 

5.3.2 特定的字符

 

如前所述,非特殊的东西在模式里匹配自身。这意味着一个 /a/ 匹配一个 "a",一个 /=/ 匹配一个 "=" 等等。不过,有些字符可不是那么容易在键盘上敲进去,或者即使你敲进去了,也不会在打印输出中显示出来;最臭名昭著的例子就是控制字符。在正则表达式里,Perl 识别下列双引号包围的字符别名:

 

逃逸含义
\0空字符(ASCII NUL)
\a警铃(BEL)
\e逃逸(ESC)
\f进纸(FF)
\n换行符 (NL,Mac里的CR)
\r回车(CR,Mac里的NL)
\t水平制表符(HT)

 

就象在双引号包围字串里一样,Perl 还识别模式里的下面四种元符号:

 

\cX

一个命名的控制字符,象 \cC 指 Control-C,\cZ 指 Control-Z,\c[ 指 ESC,而 \c? 表示 DEL。

 

\NNN

用两位或者三位八进制码声明的字符。除了小于 010 的数值(十进制 8)外,前导的 0 是可选的,因为(和在双引起字串里不同)一位数字的东西总认为是用于在模式里捕获字串的引用。如果你在模式里先捕获了至少 n 个子字串,那多位数字解释成第 n 个引用(这里 n 被认为是一个十进制数)。否则,他们被解释成一个用八进制声明的字符。

 

\x{LONGHEX}

一个用一到两个十六进制数位([0-9a-fA-F])声明的字符,比如 \x1B。一位数字的形式只有在后面跟随的字符不是一个十六进制数字才可用。如果使用了花括弧,你想用多少位数字都可以,这时候结果可能是一个 Unicode 字符。比如,\x{262} 匹配一个 Unicode YIN YANG。

 

\N{NAME}

一个命名字符,如 \N{GREEK SMALL LETTER EPSILON},\N{Greek:epsilon},或者\N{epsilon}。它要求使用第三十一章,用法模块,里描述的 use charnames 用法,它同时还判断你可能使用那些名字中的哪一个(分别是 ":long",":full",":short",对应上面三个风格。)

你可以在离你最近的 Unicode 标准文档里找到所有 Unicode 字符名字的列表,或者在 PATH_TO_PERLLIB/unicode/Names.txt 里也有。

 

5.3.3 通配元符号

三个特殊的元符号可以用做通用通配符,它们的每一个都可以匹配"任何"字符(是"任何"中的某些字符)。它们是句点("."),\c 和 \x。它们都不能在字符表里使用。你不能在字符表里用句点是因为它会匹配(几乎)任何存在的字符,因此它本身就是某种万能字符。如果你想包括或者排除所有东西,也没有什么必要使用一个字符表。特殊通配符 \C 和 \X 有着特殊的结构化含义,而这些特殊含义和选择单个 Unicode 字符的表示法关联得并不好,而该表示法才是字符表运行的层次.

句点元字符匹配除了换行符以外的任何单字符。(如果带着 /s 修饰词,也能匹配换行符。)和十二个特殊字符里的其它字符一样,如果你想匹配一个文本句点,你就必须用一个反斜扛逃逸它。比如,下面的代码检查一个文件名是否以一个句点后面跟着一个单字符扩展名结尾的:

 

   if ($pathname =~ /\.(.)\z/s) {
      print "Ends in $1\n";
   }

第一个句点是逃逸了的,是文本句点,而第二个句点说"匹配任何字符"。\z 说只匹配字串末尾的东西,而 \s 修饰词令点也可以匹配换行符。(的确,用换行符做文件扩展名不怎么漂亮,但并不是说就不能做。)

点元字符经常和量词一起使用。.* 匹配尽可能多的字符,而 .*? 匹配尽可能少的字符。不过有时候它不用量词而是自己解决长度问题: /(..):(..):(..)/ 匹配三个用冒号分隔的域,每个域两个字符长。

如果你在一个 use utf8 用法的词法范围里编译的模式里使用一个点,那么它就匹配任何 Unicode 字符。(你可能不需要用 use utf8,不过偶然还是会发生的,在你阅读到这里的时候你可能不需要这个用法。)

 

   use utf8;
   use charnames qw/:full/;
   %BWV[887] = "G\N{MUSIC SHARP SIGN} minor";
   ($note, $black, $mode) = $BWV[886] =~ /^([A-G])(.)\s+(\S+)/;
   print "That's lookin' sharp!\n" if $black eq chr(9839);

元符号 \X 在更广的概念上匹配字符。它实际上是匹配一个由一个或多个 Unicode 字符组成的字串,这个字串就是所谓的"组合字符序列"。这样的序列包括一个基本字符和后面跟着任意个"标志"字符(象变音符和分音符那样的区分标志)一起组成一个逻辑单元。\X 实际上等效于 (?:\PM\pM*)。这样做允许匹配一个逻辑字符,即使这几个字符实际上是由几个独立的字符组成的也行。如果匹配任意组合字符,那么在 /\X/ 里匹配的长度将超过一个字符长。(而且这里的字符长度和字节长度没有什么关系)。

如果你在使用 Unicode 并且真的想获取单字节而不是单字符,那么你可以使用 \C 元字符。它将总是匹配一个字节(具体说,就是一个 C 语言的 char 类型),而不管是否会与你的 Unicode 字符流步调失调。参阅第十五章里关于做这些事情时合适的警告。

 

5.4 字符表

在模式匹配里,你可以匹配任意字符,不管它们有没有特殊性质。有四种声明字符表的方法(译注:孔乙己?:)。你可以按照传统的方法声明字符集——用方括弧和枚举可能的字符,或者或者你可以使用三种记忆法中的任意一种:经典 Perl 表,新 PerlUnicode 属性,或者标准 POSIX 表。这些缩写均只匹配其字符集中的一个字符。你可以量化它们,使它们可以匹配更多的字符,比如 \d+ 匹配一个或者多个数字。(一个比较容易犯的错误是认为 \w 匹配一个字。用 \w+ 匹配一个字。)

 

5.4.1 客户化字符表

一个方括弧中的一个枚举字符列表被称为字符表,它匹配列表中的任何一个字符。比如,[aeiouy] 匹配一个英文中的元音字母。(对于威尔士要加 "w",对于苏格兰加个 "r"。)要匹配一个右方括弧,你可以用反斜杠逃逸之或者把它放在列表开头。

字符范围可以用一个连字符和 a-z 表示法表示。你可以合并多个范围;比如 [0-9a-fA-F] 匹配一个十六进制“位”。你可以用反斜杠避免连字符被解释为一个范围分隔符,或者把它放在表的开头或者结尾(后面的方法虽然不易读,但是比较常用)。

在字符表开头的脱字符(或者说是抑扬符号,或者帽子,或者向上箭头 "^" )反转该字符表,结果是匹配任何不在此列表中的字符。(要匹配脱字符,要么不要放在开头,或者是用反斜杠逃逸)。比如,[^aeiouy] 匹配任何不是元音的字母。不过,对待字符表反意要小心些,因为字符的领域在不断扩展。比如,那个字符表匹配辅音——而在西利尔语,希腊语和几乎任何语言里还匹配空白,换行符和其他任何东西(包括元音),更不用说中日韩文里的标记了。而且以后还可能有 Cirth,Tengwar,和 Klingon。(当然,还可能有 Linear B 和 Etruscan)所以你最好还是明确声明你的辅音,比如[cbdfghjklmnpqrstvwxyz],或者简写为 [b-df-hj-p-tv-z]。(这样还解决了“y”需要在两个地方同时出现的问题,排除了一个补集。)

字符表里支持普通字符元符号,(参阅“声明字符”),比如 \n,\t,\cX,\NNN,和 \N{NAME}。另外,你可以在一个字符表里使用 \b 表示一个退格,就象它在双引号字串里显示的那样。通常,在一个模式匹配里,它意味着一个字边界。但是零宽度的断言在字符表里没有任何意义,因此这里的 \b 返回到它在字串里的普通含义。你还可以使用我们本章稍后预定义的任何字符表(经典,Unicode 或 POSIX),但是不要把它们用在一个范围的结尾——那样没有意义,所以 "-" 会被解释成文本。

所有其他的元符号在方括弧中都失去特殊意义。实际上,你不能在这里面使用三个普通通配符中的任何一个:".",\X 或 \C。不允许第一个字符通常令人奇怪,不过把普遍意义的字符表用做有限制的形式的确没有什么意义,而且你常会在一个字符表中要用到文本句点——比如,当你要匹配文件名的时候。而且在字符表里声明量词,断言或者候选都是没有意义的,因为这些字符都是独立解释的。比如,[fee|fie|foe|foo] 和 [feio|] 是一样的。

 

5.4.2 典型 Perl 字符表缩写

从一开始,Perl 就已经提供了一些字符表缩写。它们在表 5-8 中列出。它们都是反斜杠字母元字符,而且把它们的字母换成大写后,它们的含义就是小写版本的反义。这些元字符的含义并不像你想象的那么固定,其含义可能在新的 Unicode 标准出台后改变,因为新标准会增加新的数字和字母。(为了保持旧的字节含义,你总是可以使用 use bytes。要解释 utf8 的含义,参阅本章后面的 "Unicode 属性"。不管怎样,utf8 含义都是字节含义的超集。)

表 5-8 典型字符表

 

符号含义做字节做 utf8
\d数字[0-9]\p{IsDigit}
\D非数字[^0-9}\P{IsDigit}
\s空白[ \t\n\r\f]\p{IsSpace}
\S非空白[^ \t\n\r\f]\P{IsSpace}
\w[a-zA-Z0-9_]\p{IsWord}
\W非字[^a-zA-Z0-9_]\P{IsWord}

(好好好,我们知道大多数字里面没有数字和下划线,\w 的用意是用于匹配典型的编程语言里的记号。就目前而言,是匹配 Perl 里的记号。)

这些元符号在方括弧外面或者里面都可以使用,也就是说不管作为独立存在的符号还是作为一个构造成的字符表的一部分存在都行:

 

   if ($var =~ /\D/)   { warn "contains non-digit" }
   if ($var =~ /[^\w\s.]/) { warn "contains non-(word, space, dot)"}

 

5.4.3 Unicode 属性

Unicode 属性可以用 \p{PROP} 及其补集 \P{PROP} 获取.对于那些比较少见的名字里只有一个字符的属性,花括弧是可选的,就象 \pN 表示一个数字字符(不一定是十进制数 - 罗马数字也是数字字符)。这些属性表可以独自使用或者与一个字符表构造一起使用:

 

   if ($var =~ /^\p{IsAlpha}+$/)    {print "all alphabetic" }
   if ($var =~ s/[\p{Zl}\p{Zp}]/\n/g) {print "fixed newline wannabes"}

有些属性是直接由 Unicode 标准定义的,而有些属性是 Perl 基于标准属性组合定义的,Zl 和 Zp 都是标准 Unicode 属性,分别代表行分隔符和段分隔符,而 IsAlpha? 是 Perl 而 IsAlpha? 是 Perl 定义的,是一个组合了标准属性 Ll, Lu, Lt, 和 Lo (也就是小写,大写,标题或者其它字母)的属性表。在 Perl 5.6.0 里,要想用这些属性,你得用 use utf8。将来会放松这个限制。

还有很多其它属性。我们会列出我们知道的那些,但是这个列表肯定不完善。很可能在新版本的 Unicode 里会定义新的属性,而且你甚至也可以定义自己的属性。稍后我们将更详细地介绍这些。

Unicode 委员会制作了在线资源,这些资源成为 Perl 用于其 Unicode 实现里的各种文件。关于更多这些文件的信息,请参阅第 15 章。你可以在文档 PATH_TO_PERLLIB/unicode/Unicode3.html 里获得很不错的关于 Unicode 的概述性介绍。这里 PATH_TO_PERLLIB 是下面命令的打印输出:

 

   perl -MConfig -le 'print $Config{privlib}'

大多数 Unicode 的属性形如 \p{IsPROP}。Is 是可选的,因为它太常见了,不过你还是会愿意把它们写出来的,因为可读性好。

 

5.4.3.1 Perl 的 Unicode 属性

首先,表 5-9 列出了 Perl 的组合属性。它们定义得合理地接近于标准 POSIX 定义的字符表。

表5-9.组合 Unicode 属性

 

属性等效
IsASCII?[\x00-\x7f]
IsAlnum?[\p{IsLl}\p{IsLu}\p{IsLt}\p{IsLo}\p{IsNd}]
IsAlpha?[\p{IsLl}\p{IsLu}\p{IsLt}\p{IsLo}]
IsCntrl?\p{IsC}
IsDigit?\p{Nd}
IsGraph?[^\pC\p{IsSpace}]
IsLower?\p{IsLl}
IsPrint?\P{IsC}
IsPunct?\p{IsP}
IsSpace?[\t\n\f\r\p{IsZ}]
IsUpper?[\p{IsLu}\p{IsLt}]
IsWord?[_\p{IsLl}\p{IsLu}\p{IsLt}\p{IsLo}\p{IsNd}]
IsXDigit?[0-9a-fA-F]

 

Perl 还为标准 Unicode 属性(见下节)的每个主要范畴提供了下列组合:

 

属性含义是否规范的
IsC?错误控制代码等
IsL?字母部分
IsM?标志
IsN?数字
IsP?标点
IsS?符号
IsZ?分隔符

 

5.4.3.2 标准的 Unicode 属性

 

表 5-10 列出了大多数基本的标准 Unicode 属性,源自每个字符的类别。没有哪个字符是多于一个类别的成员。有些属性是规范的,而有些只是提示性的。请参阅 Unicode 标准获取那些标准的说辞,看看什么是规范信息,而什么又是提示信息。

表 5-10 标准 Unicode 属性

 

属性含义规范化
IsCc?其他,控制
IsCf?其他,格式
IsCn?其他,未赋值
IsCo?其他,私有使用
IsCs?其他,代理
IsLl?字母,小写
IsLm?字母,修饰词
IsLo?字母,其他
IsLt?字母,抬头
IsLu?字母,大写
IsMc?标记,组合
IsMe?标记,闭合
IsMn?标记,非空白
IsNd?数字,十进制数
IsNl?数字,字母
IsNo?数字,其他
IsPc?标点,联接符
IsPd?标点,破折号
IsPe?标点,关闭
IsPf?标点,结束引用
IsPi?标点,初始引用
IsPo?标点,其他
IsPs?标点,打开
IsSc?符号,货币
IsSk?符号,修饰词
IsSm?符号,数学
IsSo?符号,其他
IsZl?分隔符,行
IsZp?分隔符,段落
IsZs?分隔符,空白

另外一个有用的属性集是关于一个字符是否可以分解为更简单的字符。(规范分解或者兼容分解)。规范分解不会丢失任何格式化信息。兼容分解可能会丢失格式信息,比如一个字符是否上标等。

 

属性信息丢失
IsDecoCanon?
IsDecoCompat?有一些(下列之一)
IsDCcircle?字符周围的圆
IsDCfinal?最终的位置(阿拉伯文)
IsDCfont?字体变体的选择
IsDCfraction?俚语字符片段
IsDCinitial?起始位置选择(阿拉伯文)
IsDCisolated?隔离位置选择(阿拉伯文)
IsDCmedial?中间位置选择(阿拉伯文)
IsDCnarrow?窄字符
IsDCnoBreadk?空白或连字符的非中断选
IsDCsmall?小字符
IsDCsquare?CJK字符周围的方块
IsDCsub?脚标
IsDCsuper?上标
IsDCvertical?旋转(水平或垂直)
IsDCwide?宽字符
IsDCcompat?标识(杂项)

下面是那些对双向书写的人感兴趣的属性:

 

 

属性含义
IsBidiL?从左向右(阿拉伯语,希伯来语)
IsBidiLRE?从左向右插入
IsBidiLRO?从左向右覆盖
IsBidiR?从右向左
IsBidiAL?阿拉伯语从右向左
IsBidiRLE?从右向左插入
IsBidiRLO?从右向左覆盖
IsBidiPDF?流行方向的格式
IsBidiEN?欧洲数字
IsBidlES?欧洲数字分隔符
IsBidkET?欧洲数字结束符
IsBidiAN?阿拉伯数字
IsBidiCS?普通数字分隔符
IsBidiNSM?非空白标记
IsBidiBN?与边界无色
IsBidiB?段落分隔符
IsBidiS?段分隔符
IsBidiWS?空白
IsBidiON?其他无色字符
IsMirrored?当使用从右向左模式时反向

下面的属性根据元音的发音把它们分类为各种音节:

IsSylA         IsSylE         IsSylO         IsSylWAA       IsSylWII
IsSylAA        IsSylEE        IsSylOO        IsSylWC        IsSylWO
IsSylAAI       IsSylI         IsSylU         IsSylWE        IsSylWOO
IsSylAI        IsSylII        IsSylV         IsSylWEE       IsSylWU
IsSylC         IsSylN         IsSylWA        IsSylWI        IsSylWV

比如,\p{IsSyLA} 将匹配 \N{KATAKANA LETTER KA},但不匹配 \N{KATAKANA LETTER KU}。

既然你现在基本上已经知道了所有的这些 Unicode 3.0 属性,那我们还要说的是在版本 5.6 的 Perl 里有几个比较秘传的属性还没有实现,因为它们的实现有一部分是基于 Unicode 2.0 的,而且,象那些双向的算法还在我们的制作之中。不过,等到你读到这些的时候,那些缺失的属性可能早就实现了,所以我们还是把它们列出来了。

 



to top

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
原书名: Perl by Example(Third Edition),原出版社: PH PTR,作者: Ellie Quigley,译者: 杜炜,出版社:清华大学出版社,出版日期:2002 年8月,PDF 格式,大小 19 Mb。 内容简介 本书以最新版本的Perl 5.6.1为范本,全面介绍了Perl语言,其内容包含Perl的所有主题。对每个主题都使用了范例说明,从Perl变量、正则表达式,到编写报表、CGI脚本和网络应用,并对范例程序进行了解释。读者可以很容易地通过这些范例掌握Perl语言的语法。附录含有完整的函数和定义、命令行开关、特殊变量、常见模块和Perl调试器的列表,全功能的、面向对象的CGI程序,一些有用的脚本,以及很有帮助的HTM教程。 本书非常适合于Perl语言初学者阅读,对于Perl程序员,也有很大的参考价值。 目录 第1章 实用摘要和报表语言 1.1 什么是Perl 1.2 Perl用户 1.3 Perl的版本 1.4 如何获得Perl 1.5 什么是CPAN 1.6 Perl文档 第2章 Perl脚本 2.1 从命令行使用Perl 2.1.1 七开关 2.1.2 -n开关 2.1.3 -c开关 2.2 脚本设置 2.3 脚本 2.3.1 开始 2.3.2 注释 2.3.3 Perl语句 2.3.4 执行脚本 2.3.5 脚本范例(UNIX, Windows) 练习1 了解Perl的语法 .第3章 获得打印句柄 3.1 文件句柄 3.2 字 3.2.1 引号 3.2.2 实量(常量) 3.3 print函数 3.3.1 打印实量 3.3.2 警告编译指示和-w开关 3.3.3 strict编译指示和字 3.4 printf函数 3.4.1 sprintf函数 3.4.2 无引号打印:here document 练习2 编写literals脚本 第4章 变量 4.1 关于Perl变量 4.1.1 类型 4.1.2 作用域和包 4.1.3 命名规范 4.1.4 赋值语句 4.1.5 引号规则 4.2 标量、数组和散列 4.2.1 标量变量 4.2.2 数组 4.2.3 散列 4.3 从STDIN读取 4.3.1 把输入赋值给标量变量 4.3.2 chop和chomp函数 4.3.3 read函数 4.3.4 getc函数 4.3.5 将输入赋值给数组 4.3.6 将输入赋值给散列 4.4 数组函数 4.4.1 chop和chomp函数(用于列表) 4.4.2 exists函数 4.4.3 delete函数 4.4.4 grep函数 4.4.5 join函数 4.4.6 map函数 4.4.7 pack和unpack函数 4.4.8 pop函数 4.4.9 push函数 4.4.10 shift函数 4.4.11 splice函数 4.4.12 split函数 4. 4.13 sort函数 4.4.14 reverse函数 4.4.15 unshift函数 4.5 散列(关联数组)函数 4.5.1 keys函数 4.5.2 values函数 4.5.3 each函数 4.5.4 delete函数 4.5.5 exists函数 4.6 关于散列的更多内容 4.6.1 从文件加载散列 4.6.2 特殊散列 4.6.3 语境 练习3 特殊字符 第5章 运算符 5.1 关于Perl运算符 5.2 混合数据类型 5.3 优先权与结合性 5.3.1 赋值运算符 5.3.2 关系运算符 5.3.3 等值运算符 5.3.4 逻辑运算符(短路运算符) 5.3.5 逻辑字运算符 5.3.6 算术运算符 5.3.7 自动递增和自动递减运算符 5.3.8 位逻辑运算符 5.3.9 条件运算符 5.3.10 范围运算符 5.3.11 特殊字符串运算符和函数 5.3.12 生成随机数 5.3.13 rand/srand函数 练习4 运算符 第6章 条件 6.1 控制结构,块和复合语句 6.2 决策--条件结构 6.2.1 if和unless语句 6.2.2 unless语句结构 6.3 循环 6.3.1 while循环 6.3.2 until循环 6.3.3 for循环 4.5.2 values函数 4.5.3 each函数 4.5.4 delete函数 4.5.5 exists函数 4.6 关于散列的更多内容 4.6.1 从文件加载散列 4.6.2 特殊散列 4.6.3 语境 练习3 特殊字符 第5章 运算符 5.1 关于Perl运算符 5.2 混合数据类型 5.3 优先权与结合性 5.3.1 赋值运算符 5.3.2 关系运算符 5.3.3 等值运算符 5.3.4 逻辑运算符(短路运算符) 5.3.5 逻辑字运算符 5.3.6 算术运算符 5.3.7 自动递增和自动递减运算符 5.3.8 位逻辑运算符 5.3.9 条件运算符 5.3.10 范围运算符 5.3.11 特殊字符串运算符和函数 5.3.12 生成随机数 5.3.13 rand/srand函数 练习4 运算符 第6章 条件 6.1 控制结构,块和复合语句 6.2 决策--条件结构 6.2.1 if和unless语句 6.2.2 unless语句结构 6.3 循环 6.3.1 while循环 6.3.2 until循环 6.3.3 for循环 6.3.4 foreach循环 6.3.5 循环控制 6.3.6 伪开关语句 练习5 条件是什么 第7章 正则表达式--模式匹配 7.1 什么是正则表达式 7.2 表达式修饰符和简语句 7.2.1 条件修饰符 7.2.2 DATA文件句柄 7.2.3 循环修饰符 7.3 正则表达式运算符 7.3.1 m运算符和匹配 7.3.2 s运算符和替换 7.3.3 模式绑定运算符 练习6 它是sed、awk或grep吗?尝试Perl 第8章 获得控制:正则表达式元字符 8.1 正则表达式元字符 8.1.1 用于单字符的元字符 8.1.2 白空元字符 8.1.3 重复模式匹配的元字符 8.1.4 tr或y函数 8.2 统一字符编码(Unicode) 练习7 是sed、awk或grep吗?给出Perl的另外一个作用 第9章 获得文件句柄 9.1 用户定义文件句柄 9.1.1 打开文件:open函数 9.1.2 打开文件读 9.1.3 打开文件写 9.1.4 Win32文件 9.1.5 打开文件添加 9.1.6 select函数 9.1.7 使用flock锁住文件 9.1.8 seek和tell函数 9.1.9 打开文件读写 9.1.10 管道打开 9.2 传送参数 9.2.1 ARGV数组 9.2.2 ARGV和Null文件句柄 9.2.3 eof函数 9.2.4 -i开关:原位编辑文件 9.3 文件测试 练习8 获得文件句柄 第10章 子程序和函数 10.1 子程序/函数 10.1.1 定义和调用于程序 10.1.2 传送参数 10.1.3 原型 10.1.4 返回值 10.1.5 通过引用调用--别名和Typeglobs 10.1.6 通过指针传送 10.1.7 自动加载 10.1.8 BEGIN和END子程序(开始和结束) 10.1.9 subs函数 练习9 子程序不可缺少 第11章 模块化、打包并发送到库 11.1 包和模块 11.1.1 类比 11.1.2 定义 11.1.3 符号表 11.2 标准Perl库 11.2.1 @INC数组 11.2.2 包和.p1文件 11.2.3 模块和.pm文件 11.2.4 来自CPAN的模块 练习10 将所有的Perl都放入包 练习11 压缩并放入库 第12章 这个工作要求引用吗 12.1 什么是引用 12.1.1 符号引用与硬引用 12.1.2 硬引用 12.1.3 引用和匿名变量 12.1.4 嵌套数据结构 12.1.5 引用和子程序 12.1.6 文件句柄引用 12.1.7 ref函数 练习12 指向地址 第13章 面向对象的Perl 13.1 OOP范型 13.1.1 回顾包和模块 13.1.2 一些面向对象的专用术语 13.2 类、对象和方法 13.2.1 类和专用性 13.2.2 对象 13.2.3 bless函数 13.2.4 方法 13.2.5 多态性和动态绑定 13.2.6 析构函数和无用存储单元收集 13.3 继承 13.3.1 @ISA数组和调用方法 13.3.2 $AUTOLOAD,sub AUTOLOAD和UNIVERSAL 13.3.3 派生类 13.3.4 多重继承 13.3.5 面向对象术语--父方法 13.4 公共用户接口:文档编制类 13.4.1 pod文件 13.4.2 pod命令 13.4.3 如何使用pod解释程序 13.4.4 将pod文档翻译成文本 13.4.5 将pod文档翻译成HTML 13.5 使用Perl的对象 13.5.1 再看标准Perl库 13.5.2 标准Perl面向对象的模块 13.5.3 使用标准Perl的模块 练习13 这一课的对象是什么 练习14 函数PodPerl 第14章 tie函数,DBM文件和数据库挂钩 14.1 连接变量与类 14.1.1 tie函数 14.1.2 预定义方法 14.1.3 连接标量 14.1.4 连接数组 14.1.5 连接散列 14.2 DBM文件 14.2.1 创建并赋给DBM文件数据 14.2.2 从DBM文件检索数据 14.2.3 从DBM文件删除项 第15章 Perl数据库编程 15.1 本章概述 15.2 Perl数据库编程 15.3 使用RDBMS的Perl编程 15.3.1 在Windows系统上安装Perl 15.3.2 使用PPM在Windows系统上安装Perl模块 15.3.3 安装RDBMS 15.3.4 为MMS范例创建DSN 15.4 使用ADO和DBI访问MSS 15.4.1 Microsoft SQL Server--范例15-1和15-3的查询 15.4.2 范例15-1:ex1.p1在MS SQL Server上的ADO简单查询,DSN 15.4.3 执行DDL和DML操作 15.4.4 范例15-2:ex2.p1 MSS上persons.sql的Perl ADO,无DSN 15.4.5 范例15-3:ex3.p1 MS SQL Server上的Perl DBI范例 15.4.6 范例15-4:ex4.p1 MSS上persons.sql的Perl DBl 15.5 使用ADO和DBI访问Oracle 15.5.1 Oracle--范例15-5(ADO)和15-7(DBI)的简单查询 15.5.2 为Oracle范例创建DSN 15.5.3 范例15-5:ex5.p1 Oracle上的ADO简单查询,DSN 15.5.4 在Oracle上执行DDL和DML操作 15.5.5 范例15-6:ex6.pl Oracle上persons.sql的Perl ADO,无DSN 15.5.6 范例15-7:ex7.pl Oracle上的Perl DBI简单查询 15.5.7 范例15-8:ex8.ploracle上persons.sql的Perl DBI 15.6 练习:非编程 练习15 使用MSS 练习16 在MSS执行persons.p1 练习17 使用Oracle 练习18 在Oracle执行persons.p1 15.7 参考文献 第16章 与系统接口 16.1 系统调用 16.1.1 目录和文件 16.1.2 目录和文件属性 16.1.3 查找目录和文件 16.1.4 创建目录--mkdir函数 16.1.5 删除目录--rmdir函数 16.1.6 更改目录--chdir函数 16.1.7 通过目录文件句柄访问目录 16.1.8 许可和所有权 16.1.9 硬和软链接 16.1.10 更改文件名 16.1.11 更改访问和修改时间 16.12 文件统计量 16.1.13 低级文件I/O 16.1.14 压缩和解压缩数据 16.2 进程 16.2.1 UNIX进程 16.2.2 Win32进程 16.2.3 环境(UNIX和Windows) 16.2.4 进程和文件句柄 16.2.5 进程优先权和Nice 16.2.6 口令信息 16.2.7 时间和进程 16.2.8 UNIX进程创建 16.2.9 Win32进程创建 16.3 其他与操作系统接口的途径 16.3.1 syscall函数和h2hp脚本 16.3.2 命令替换--备份引号 16.3.3 Shell.pm模块(Perl) 16.3.4 system函数 16.3.5 here documents 16.3.6 Globbing(文件名扩展和通配符) 16.4 错误处理 16.4.1 die函数
言 1. 一般信息 1.1. 关于本手册 1.2. 本手册采用的惯例 1.3. MySQL AB概述 1.4. MySQL数据库管理系统概述 1.4.1. MySQL的历史 1.4.2. MySQL的的主要特性 1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 1.5.4. 许可和支持 1.5.5. MaxDB和MySQL之间的特性差异 1.5.6. MaxDB和MySQL之间的协同性 1.5.7. 与MaxDB有关的链接 1.6. MySQL发展大事记 1.6.1. MySQL 5.1的新特性 1.7. MySQL信息源 1.7.1. MySQL邮件列表 1.7.2. IRC(在线聊天系统)上的MySQL社区支持 1.7.3. MySQL论坛上的MySQL社区支持 1.8. MySQL标准的兼容性 1.8.1. MySQL遵从的标准是什么 1.8.2. 选择SQL模式 1.8.3. 在ANSI模式下运行MySQL 1.8.4. MySQL对标准SQL的扩展 1.8.5. MySQL与标准SQL的差别 1.8.6. MySQL处理约束的方式 2. 安装MySQL 2.1. 一般安装问题 2.1.1. MySQL支持的操作系统 2.1.2. 选择要安装的MySQL分发版 2.1.3. 怎样获得MySQL 2.1.4. 通过MD5校验和或GnuPG验证软件包的完整性 2.1.5. 安装布局 2.2. 使用二进制分发版的标准MySQL安装 2.3. 在Windows上安装MySQL 2.3.1. Windows系统要求 2.3.2. 选择安装软件包 2.3.3. 用自动安装器安装MySQL 2.3.4. 使用MySQL安装向导 2.3.5. 使用配置向导 2.3.6. 通过非安装Zip文件安装MySQL 2.3.7. 提取安装档案文件 2.3.8. 创建选项文件 2.3.9. 选择MySQL服务器类型 2.3.10. 首次启动服务器 2.3.11. 从Windows命令行启动MySQL 2.3.12. 以Windows服务方式启动MySQL 2.3.13. 测试MySQL安装 2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X安装MySQL 2.6. 在NetWare安装MySQL 2.7. 在其它类Unix系统安装MySQL 2.8. 使用源码分发版安装MySQL 2.8.1. 源码安装概述 2.8.2. 典型配置选项 2.8.3. 从开发源码树安装 2.8.4. 处理MySQL编译问题 2.8.5. MIT-pthreads注意事项 2.8.6. 在Windows下从源码安装MySQL 2.8.7. 在Windows下编译MySQL客户端 2.9. 安装后的设置和测试 2.9.1. Windows下安装后的过程 2.9.2. Unix下安装后的过程 2.9.3. 使初始MySQL账户安全 2.10. 升级MySQL 2.10.1. 从5.0版升级 2.10.2. 升级授权表 2.10.3. 将MySQL数据库拷贝到另一台机器 2.11. 降级MySQL 2.12. 具体操作系统相关的注意事项 2.12.1. Linux注意事项 2.12.2. Mac OS X注意事项 2.12.3. Solaris注意事项 2.12.4. BSD注意事项 2.12.5. 其它Unix注意事项 2.12.6. OS/2注意事项 2.13. Perl安装注意事项 2.13.1. 在Unix安装Perl 2.13.2. 在Windows下安装ActiveState Perl 2.13.3. 使用Perl DBI/DBD接口的问题 3. 教程 3.1. 连接与断开服务器 3.2. 输入查询 3.3. 创建并使用数据库 3.3.1. 创建并选择数据库 3.3.2. 创建表 3.3.3. 将数据装入表 3.3.4. 从表检索信息 3.4. 获得数据库和表的信息 3.5. 在批处理模式下使用mysql 3.6. 常用查询的例子 3.6.1. 列的最大值 3.6.2. 拥有某个列的最大值的行 3.6.3. 列的最大值:按组 3.6.4. 拥有某个字段的组间最大值的行 3.6.5. 使用用户变量 3.6.6. 使用外键 3.6.7. 根据两个键搜索 3.6.8. 根据天计算访问量 3.6.9. 使用AUTO_INCREMENT 3.7. 孪生项目的查询 3.7.1. 查找所有未分发的孪生项 3.7.2. 显示孪生对状态的表 3.8. 与Apache一起使用MySQL 4. MySQL程序概述 4.1. MySQL程序概述 4.2. 调用MySQL程序 4.3. 指定程序选项 4.3.1. 在命令行上使用选项 4.3.2. 使用选项文件 4.3.3. 用环境变量指定选项 4.3.4. 使用选项设置程序变量 5. 数据库管理 5.1. MySQL服务器和服务器启动脚本 5.1.1. 服务器端脚本和实用工具概述 5.1.2. mysqld-max扩展MySQL服务器 5.1.3. mysqld_safe:MySQL服务器启动脚本 5.1.4. mysql.server:MySQL服务器启动脚本 5.1.5. mysqld_multi:管理多个MySQL服务器的程序 5.2. mysqlmanager:MySQL实例管理器 5.2.1. 用MySQL实例管理器启动MySQL服务器 5.2.2. 连接到MySQL实例管理器并创建用户账户 5.2.3. MySQL实例管理器命令行选项 5.2.4. MySQL实例管理器配置文件 5.2.5. MySQL实例管理器识别的命令 5.3. mysqld:MySQL服务器 5.3.1. mysqld命令行选项 5.3.2. SQL服务器模式 5.3.3. 服务器系统变量 5.3.4. 服务器状态变量 5.4. mysql_fix_privilege_tables:升级MySQL系统表 5.5. MySQL服务器关机进程 5.6. 一般安全问题 5.6.1. 通用安全指南 5.6.2. 使MySQL在攻击者面前保持安全 5.6.3. Mysqld安全相关启动选项 5.6.4. LOAD DATA LOCAL安全问题 5.7. MySQL访问权限系统 5.7.1. 权限系统的作用 5.7.2. 权限系统工作原理 5.7.3. MySQL提供的权限 5.7.4. 与MySQL服务器连接 5.7.5. 访问控制, 阶段1:连接核实 5.7.6. 访问控制, 阶段2:请求核实 5.7.7. 权限更改何时生效 5.7.8. 拒绝访问错误的原因 5.7.9. MySQL 4.1的密码哈希处理 5.8. MySQL用户账户管理 5.8.1. MySQL用户名和密码 5.8.2. 向MySQL增加新用户账户 5.8.3. 从MySQL删除用户账户 5.8.4. 限制账户资源 5.8.5. 设置账户密码 5.8.6. 使你的密码安全 5.8.7. 使用安全连接 5.9. 备份与恢复 5.9.1. 数据库备份 5.9.2. 示例用备份与恢复策略 5.9.3. 自动恢复 5.9.4. 表维护和崩溃恢复 5.9.5. myisamchk:MyISAM表维护实用工具 5.9.6. 建立表维护计划 5.9.7. 获取关于表的信息 5.10. MySQL本地化和国际应用 5.10.1. 数据和排序用字符集 5.10.2. 设置错误消息语言 5.10.3. 添加新的字符集 5.10.4. 字符定义数组 5.10.5. 字符串比较支持 5.10.6. 多字节字符支持 5.10.7. 字符集问题 5.10.8. MySQL服务器时区支持 5.11. MySQL日志文件 5.11.1. 错误日志 5.11.2. 通用查询日志 5.11.3. 二进制日志 5.11.4. 慢速查询日志 5.11.5. 日志文件维护 5.12. 在同一台机器上运行多个MySQL服务器 5.12.1. 在Windows下运行多个服务器 5.12.2. 在Unix运行多个服务器 5.12.3. 在多服务器环境使用客户端程序 5.13. MySQL查询高速缓冲 5.13.1. 查询高速缓冲如何工作 5.13.2. 查询高速缓冲SELECT选项 5.13.3. 查询高速缓冲配置 5.13.4. 查询高速缓冲状态和维护 6. MySQL的复制 6.1. 复制介绍 6.2. 复制实施概述 6.3. 复制实施细节 6.3.1. 复制主线程状态 6.3.2. 复制从I/O线程状态 6.3.3. 复制从SQL线程状态 6.3.4. 复制传递和状态文件 6.4. 如何设置复制 6.5. 不同MySQL版本之间的复制兼容性 6.6. 升级复制设置 6.6.1. 将复制升级到5.0版 6.7. 复制特性和已知问题 6.8. 复制启动选项 6.9. 复制FAQ 6.10. 复制故障诊断与排除 6.11. 通报复制缺陷 6.12. 多服务器复制的Auto-Increment 7. 优化 7.1. 优化概述 7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息) 7.2.2. 估计查询性能 7.2.3. SELECT查询的速度 7.2.4. MySQL怎样优化WHERE子句 7.2.5. 范围优化 7.2.6. 索引合并优化 7.2.7. MySQL如何优化IS NULL 7.2.8. MySQL如何优化DISTINCT 7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何优化嵌套Join 7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.2.15. 如何避免表扫描 7.2.16. INSERT语句的速度 7.2.17. UPDATE语句的速度 7.2.18. DELETE语句的速度 7.2.19. 其它优化技巧 7.3. 锁定事宜 7.3.1. 锁定方法 7.3.2. 表锁定事宜 7.4. 优化数据库结构 7.4.1. 设计选择 7.4.2. 使你的数据尽可能小 7.4.3. 列索引 7.4.4. 多列索引 7.4.5. MySQL如何使用索引 7.4.6. MyISAM键高速缓冲 7.4.7. MyISAM索引统计集合 7.4.8. MySQL如何计算打开的表 7.4.9. MySQL如何打开和关闭表 7.4.10. 在同一个数据库创建多个表的缺陷 7.5. 优化MySQL服务器 7.5.1. 系统因素和启动参数的调节 7.5.2. 调节服务器参数 7.5.3. 控制查询优化器的性能 7.5.4. 编译和链接怎样影响MySQL的速度 7.5.5. MySQL如何使用内存 7.5.6. MySQL如何使用DNS 7.6. 磁盘事宜 7.6.1. 使用符号链接 8. 客户端和实用工具程序 8.1. 客户端脚本和实用工具概述 8.2. myisampack:生成压缩、只读MyISAM表 8.3. mysql:MySQL命令行工具 8.3.1. 选项 8.3.2. mysql命令 8.3.3. 怎样从文本文件执行SQL语句 8.3.4. mysql技巧 8.4. mysqlaccess:用于检查访问权限的客户端 8.5. mysqladmin:用于管理MySQL服务器的客户端 8.6. mysqlbinlog:用于处理二进制日志文件的实用工具 8.7. mysqlcheck:表维护和维修程序 8.8. mysqldump:数据库备份程序 8.9. mysqlhotcopy:数据库备份程序 8.10. mysqlimport:数据导入程序 8.11. mysqlshow-显示数据库、表和列信息 8.12. myisamlog:显示MyISAM日志文件内容 8.13. perror:解释错误代码 8.14. replace:字符串替换实用工具 8.15. mysql_zap:杀死符合某一模式的进程 9. 语言结构 9.1. 文字值 9.1.1. 字符串 9.1.2. 数值 9.1.3. 十六进制值 9.1.4. 布尔值 9.1.5. 位字段值 9.1.6. NULL值 9.2. 数据库、表、索引、列和别名 9.2.1. 识别符限制条件 9.2.2. 识别符大小写敏感性 9.3. 用户变量 9.4. 系统变量 9.4.1. 结构式系统变量 9.5. 注释语法 9.6. MySQL保留字的处理 10. 字符集支持 10.1. 常规字符集和校对 10.2. MySQL的字符集和校对 10.3. 确定默认字符集和校对 10.3.1. 服务器字符集和校对 10.3.2. 数据库字符集和校对 10.3.3. 表字符集和校对 10.3.4. 列字符集和校对 10.3.5. 字符集和校对分配示例 10.3.6. 连接字符集和校对 10.3.7. 字符串文字字符集和校对 10.3.8. 在SQL语句使用COLLATE 10.3.9. COLLATE子句优先 10.3.10. BINARY操作符 10.3.11. 校对确定较为复杂的一些特殊情况 10.3.12. 校对必须适合字符集 10.3.13. 校对效果的示例 10.4. 字符集支持影响到的操作 10.4.1. 结果字符串 10.4.2. CONVERT() 10.4.3. CAST() 10.4.4. SHOW语句 10.5. Unicode支持 10.6. 用于元数据的UTF8 10.7. 与其它DBMS的兼容性 10.8. 新字符集配置文件格式 10.9. 国家特有字符集 10.10. MySQL支持的字符集和校对 10.10.1. Unicode字符集 10.10.2. 西欧字符集 10.10.3. 欧字符集 10.10.4. 南欧与东字符集 10.10.5. 波罗的海字符集 10.10.6. 西里尔字符集 10.10.7. 亚洲字符集 11. 列类型 11.1. 列类型概述 11.1.1. 数值类型概述 11.1.2. 日期和时间类型概述 11.1.3. 字符串类型概述 11.2. 数值类型 11.3. 日期和时间类型 11.3.1. DATETIME、DATE和TIMESTAMP类型 11.3.2. TIME类型 11.3.3. YEAR类型 11.3.4. Y2K事宜和日期类型 11.4. String类型 11.4.1. CHAR和VARCHAR类型 11.4.2. BINARY和VARBINARY类型 11.4.3. BLOB和TEXT类型 11.4.4. ENUM类型 11.4.5. SET类型 11.5. 列类型存储需求 11.6. 选择正确的列类型 11.7. 使用来自其他数据库引擎的列类型 12. 函数和操作符 12.1. 操作符 12.1.1. 操作符优先级 12.1.2. 圆括号 12.1.3. 比较函数和操作符 12.1.4. 逻辑操作符 12.2. 控制流程函数 12.3. 字符串函数 12.3.1. 字符串比较函数 12.4. 数值函数 12.4.1. 算术操作符 12.4.2. 数学函数 12.5. 日期和时间函数 12.6. MySQL使用什么日历? 12.7. 全文搜索功能 12.7.1. 布尔全文搜索 12.7.2. 全文搜索带查询扩展 12.7.3. 全文停止字 12.7.4. 全文限定条件 12.7.5. 微调MySQL全文搜索 12.8. Cast函数和操作符 12.9. 其他函数 12.9.1. 位函数 12.9.2. 加密函数 12.9.3. 信息函数 12.9.4. 其他函数 12.10. 与GROUP BY子句同时使用的函数和修改程序 12.10.1. GROUP BY(聚合)函数 12.10.2. GROUP BY修改程序 12.10.3. 具有隐含字段的GROUP BY 13. SQL语句语法 13.1. 数据定义语句 13.1.1. ALTER DATABASE语法 13.1.2. ALTER TABLE语法 13.1.3. CREATE DATABASE语法 13.1.4. CREATE INDEX语法 13.1.5. CREATE TABLE语法 13.1.6. DROP DATABASE语法 13.1.7. DROP INDEX语法 13.1.8. DROP TABLE语法 13.1.9. RENAME TABLE语法 13.2. 数据操作语句 13.2.1. DELETE语法 13.2.2. DO语法 13.2.3. HANDLER语法 13.2.4. INSERT语法 13.2.5. LOAD DATA INFILE语法 13.2.6. REPLACE语法 13.2.7. SELECT语法 13.2.8. Subquery语法 13.2.9. TRUNCATE语法 13.2.10. UPDATE语法 13.3. MySQL实用工具语句 13.3.1. DESCRIBE语法(获取有关列的信息) 13.3.2. USE语法 13.4. MySQL事务处理和锁定语句 13.4.1. START TRANSACTION, COMMIT和ROLLBACK语法 13.4.2. 不能回滚的语句 13.4.3. 会造成隐式提交的语句 13.4.4. SAVEPOINT和ROLLBACK TO SAVEPOINT语法 13.4.5. LOCK TABLES和UNLOCK TABLES语法 13.4.6. SET TRANSACTION语法 13.4.7. XA事务 13.5. 数据库管理语句 13.5.1. 账户管理语句 13.5.2. 表维护语句 13.5.3. SET语法 13.5.4. SHOW语法 13.5.5. 其它管理语句 13.6. 复制语句 13.6.1. 用于控制主服务器的SQL语句 13.6.2. 用于控制从服务器的SQL语句 13.7. 用于预处理语句的SQL语法 14. 插件式存储引擎体系结构 14.1. 前言 14.2. 概述 14.3. 公共MySQL数据库服务器层 14.4. 选择存储引擎 14.5. 将存储引擎指定给表 14.6. 存储引擎和事务 14.7. 插入存储引擎 14.8. 拔出存储引擎 14.9. 插件式存储器的安全含义 15. 存储引擎和表类型 15.1. MyISAM存储引擎 15.1.1. MyISAM启动选项 15.1.2. 键所需的空间 15.1.3. MyISAM表的存储格式 15.1.4. MyISAM表方面的问题 15.2. InnoDB存储引擎 15.2.1. InnoDB概述 15.2.2. InnoDB联系信息 15.2.3. InnoDB配置 15.2.4. InnoDB启动选项 15.2.5. 创建InnoDB表空间 15.2.6. 创建InnoDB表 15.2.7. 添加和删除InnoDB数据和日志文件 15.2.8. InnoDB数据库的备份和恢复 15.2.9. 将InnoDB数据库移到另一台机器上 15.2.10. InnoDB事务模型和锁定 15.2.11. InnoDB性能调节提示 15.2.12. 多版本的实施 15.2.13. 表和索引结构 15.2.14. 文件空间管理和磁盘I/O 15.2.15. InnoDB错误处理 15.2.16. 对InnoDB表的限制 15.2.17. InnoDB故障诊断与排除 15.3. MERGE存储引擎 15.3.1. MERGE表方面的问题 15.4. MEMORY (HEAP)存储引擎 15.5. BDB (BerkeleyDB)存储引擎 15.5.1. BDB支持的操作系统 15.5.2. 安装BDB 15.5.3. BDB启动选项 15.5.4. BDB表的特性 15.5.5. 修改BDB所需的事宜 15.5.6. 对BDB表的限制 15.5.7. 使用BDB表时可能出现的错误 15.6. EXAMPLE存储引擎 15.7. FEDERATED存储引擎 15.7.1. 安装FEDERATED存储引擎 15.7.2. FEDERATED存储引擎介绍 15.7.3. 如何使用FEDERATED表 15.7.4. FEDERATED存储引擎的局限性 15.8. ARCHIVE存储引擎 15.9. CSV存储引擎 15.10. BLACKHOLE存储引擎 16. 编写自定义存储引擎 16.1. 前言 16.2. 概述 16.3. 创建存储引擎源文件 16.4. 创建handlerton 16.5. 对处理程序进行实例化处理 16.6. 定义表扩展 16.7. 创建表 16.8. 打开表 16.9. 实施基本的表扫描功能 16.9.1. 实施store_lock()函数 16.9.2. 实施external_lock()函数 16.9.3. 实施rnd_init()函数 16.9.4. 实施info()函数 16.9.5. 实施extra()函数 16.9.6. 实施rnd_next()函数 16.10. 关闭表 16.11. 为存储引擎添加对INSERT的支持 16.12. 为存储引擎添加对UPDATE的支持 16.13. 为存储引擎添加对DELETE的支持 16.14. API引用 16.14.1. bas_ext 16.14.2. close 16.14.3. create 16.14.4. delete_row 16.14.5. delete_table 16.14.6. external_lock 16.14.7. extra 16.14.8. info 16.14.9. open 16.14.10. rnd_init 16.14.11. rnd_next 16.14.12. store_lock 16.14.13. update_row 16.14.14. write_row 17. MySQL簇 17.1. MySQL簇概述 17.2. MySQL簇的基本概念 17.3. 多计算机的简单基础知识 17.3.1. 硬件、软件和联网 17.3.2. 安装 17.3.3. 配置 17.3.4. 首次启动 17.3.5. 加载示例数据并执行查询 17.3.6. 安全关闭和重启 17.4. MySQL簇的配置 17.4.1. 从源码创建MySQL簇 17.4.2. 安装软件 17.4.3. MySQL簇的快速测试设置 17.4.4. 配置文件 17.5. MySQL簇的进程管理 17.5.1. 用于MySQL簇的MySQL服务器进程使用 17.5.2. ndbd,存储引擎节点进程 17.5.3. ndb_mgmd,“管理服务器”进程 17.5.4. ndb_mgm,“管理客户端”进程 17.5.5. 用于MySQL簇进程的命令选项 17.6. MySQL簇的管理 17.6.1. MySQL簇的启动阶段 17.6.2. “管理客户端”的命令 17.6.3. MySQL簇生成的事件报告 17.6.4. 单用户模式 17.6.5. MySQL簇的联机备份 17.7. 使用与MySQL簇的高速互连 17.7.1. 配置MySQL簇以使用SCI套接字 17.7.2. 理解簇互连的影响 17.8. MySQL簇的已知限制 17.9. MySQL簇发展的重要历程 17.9.1. MySQL 5.0的MySQL簇变化 17.9.2. 关于MySQL簇的MySQL 5.1发展历程 17.10. MySQL簇常见问题解答 17.11. MySQL簇术语表 18. 分区 18.1. MySQL的分区概述 18.2. 分区类型 18.2.1. RANGE分区 18.2.2. LIST分区 18.2.3. HASH分区 18.2.4. KEY分区 18.2.5. 子分区 18.2.6. MySQL分区处理NULL值的方式 18.3. 分区管理 18.3.1. RANGE和LIST分区的管理 18.3.2. HASH和KEY分区的管理 18.3.3. 分区维护 18.3.4. 获取关于分区的信息 19. MySQL的空间扩展 19.1. 前言 19.2. OpenGIS几何模型 19.2.1. Geometry类的层次 19.2.2. 类Geometry 19.2.3. 类Point 19.2.4. 类Curve 19.2.5. 类LineString 19.2.6. 类Surface 19.2.7. 类Polygon 19.2.8. 类GeometryCollection 19.2.9. 类MultiPoint 19.2.10. 类MultiCurve 19.2.11. 类MultiLineString 19.2.12. 类MultiSurface 19.2.13. 类MultiPolygon 19.3. 支持的空间数据格式 19.3.1. 著名的文本(WKT)格式 19.3.2. 著名的二进制(WKB)格式 19.4. 创建具备空间功能的MySQL数据库 19.4.1. MySQL空间数据类型 19.4.2. 创建空间值 19.4.3. 创建空间列 19.4.4. 填充空间列 19.4.5. 获取空间数据 19.5. 分析空间信息 19.5.1. Geometry格式转换函数 19.5.2. Geometry函数 19.5.3. 从已有Geometry创建新Geometry的函数 19.5.4. 测试几何对象间空间关系的函数 19.5.5. 关于几何最小边界矩形(MBR)的关系 19.5.6. 测试几何类之间空间关系的函数 19.6. 优化空间分析 19.6.1. 创建空间索引 19.6.2. 使用空间索引 19.7. MySQL的一致性和兼容性 19.7.1. 尚未实施的GIS特性 20. 存储程序和函数 20.1. 存储程序和授权表 20.2. 存储程序的语法 20.2.1. CREATE PROCEDURE和CREATE FUNCTION 20.2.2. ALTER PROCEDURE和ALTER FUNCTION 20.2.3. DROP PROCEDURE和DROP FUNCTION 20.2.4. SHOW CREATE PROCEDURE和SHOW CREATE FUNCTION 20.2.5. SHOW PROCEDURE STATUS和SHOW FUNCTION STATUS 20.2.6. CALL语句 20.2.7. BEGIN ... END复合语句 20.2.8. DECLARE语句 20.2.9. 存储程序的变量 20.2.10. 条件和处理程序 20.2.11. 光标 20.2.12. 流程控制构造 20.3. 存储程序、函数、触发程序和复制:常见问题 20.4. 存储子程序和触发程序的二进制日志功能 21. 触发程序 21.1. CREATE TRIGGER语法 21.2. DROP TRIGGER语法 21.3. 使用触发程序 22. 视图 22.1. ALTER VIEW语法 22.2. CREATE VIEW语法 22.3. DROP VIEW语法 22.4. SHOW CREATE VIEW语法 23. INFORMATION_SCHEMA信息数据库 23.1. INFORMATION_SCHEMA表 23.1.1. INFORMATION_SCHEMA SCHEMATA表 23.1.2. INFORMATION_SCHEMA TABLES表 23.1.3. INFORMATION_SCHEMA COLUMNS表 23.1.4. INFORMATION_SCHEMA STATISTICS表 23.1.5. INFORMATION_SCHEMA USER_PRIVILEGES表 23.1.6. INFORMATION_SCHEMA SCHEMA_PRIVILEGES表 23.1.7. INFORMATION_SCHEMA TABLE_PRIVILEGES表 23.1.8. INFORMATION_SCHEMA COLUMN_PRIVILEGES表 23.1.9. INFORMATION_SCHEMA CHARACTER_SETS表 23.1.10. INFORMATION_SCHEMA COLLATIONS表 23.1.11. INFORMATION_SCHEMA COLLATION_CHARACTER_SET_APPLICABILITY表 23.1.12. INFORMATION_SCHEMA TABLE_CONSTRAINTS表 23.1.13. INFORMATION_SCHEMA KEY_COLUMN_USAGE表 23.1.14. INFORMATION_SCHEMA ROUTINES表 23.1.15. INFORMATION_SCHEMA VIEWS表 23.1.16. INFORMATION_SCHEMA TRIGGERS表 23.1.17. 其他INFORMATION_SCHEMA表 23.2. SHOW语句的扩展 24. 精度数学 24.1. 数值的类型 24.2. DECIMAL数据类型更改 24.3. 表达式处理 24.4. 四舍五入 24.5. 精度数学示例 25. API和库 25.1. libmysqld,嵌入式MySQL服务器库 25.1.1. 嵌入式MySQL服务器库概述 25.1.2. 使用libmysqld编译程序 25.1.3. 使用嵌入式MySQL服务器时的限制 25.1.4. 与嵌入式服务器一起使用的选项 25.1.5. 嵌入式服务器尚需完成的事项(TODO) 25.1.6. 嵌入式服务器示例 25.1.7. 嵌入式服务器的许可 25.2. MySQL C API 25.2.1. C API数据类型 25.2.2. C API函数概述 25.2.3. C API函数描述 25.2.4. C API预处理语句 25.2.5. C API预处理语句的数据类型 25.2.6. C API预处理语句函数概述 25.2.7. C API预处理语句函数描述 25.2.8. C API预处理语句方面的问题 25.2.9. 多查询执行的C API处理 25.2.10. 日期和时间值的C API处理 25.2.11. C API线程函数介绍 25.2.12. C API嵌入式服务器函数介绍 25.2.13. 使用C API时的常见问题 25.2.14. 创建客户端程序 25.2.15. 如何生成线程式客户端 25.3. MySQL PHP API 25.3.1. 使用MySQL和PHP的常见问题 25.4. MySQL Perl API 25.5. MySQL C++ API 25.5.1. Borland C++ 25.6. MySQL Python API 25.7. MySQL Tcl API 25.8. MySQL Eiffel Wrapper 25.9. MySQL程序开发实用工具 25.9.1. msql2mysql:转换mSQL程序以用于MySQL 25.9.2. mysql_config:获取编译客户端的编译选项 26. 连接器 26.1. MySQL Connector/ODBC 26.1.1. MyODBC介绍 26.1.2. 关于ODBC和MyODBC的一般信息 26.1.3. 如何安装MyODBC 26.1.4. 在Windows平台上从二进制版本安装MyODBC 26.1.5. I在Unix平台上从二进制版本安装MyODBC 26.1.6. 在Windows平台上从源码版本安装MyODBC 26.1.7. 在Unix平台上从源码版本安装MyODBC 26.1.8. 从BitKeeper开发源码树安装MyODBC 26.1.9. MyODBC配置 26.1.10. 与MyODBC连接相关的事宜 26.1.11. MyODBC和Microsoft Access 26.1.12. MyODBC和Microsoft VBA及ASP 26.1.13. MyODBC和第三方ODBC工具 26.1.14. MyODBC通用功能 26.1.15. 基本的MyODBC应用步骤 26.1.16. MyODBC API引用 26.1.17. MyODBC数据类型 26.1.18. MyODBC错误代码 26.1.19. MyODBC与VB:ADO、DAO和RDO 26.1.20. MyODBC与Microsoft.NET 26.1.21. 感谢 26.2. MySQL Connector/NET 26.2.1. 前言 26.2.2. 下载并安装MySQL Connector/NET 26.2.3. Connector/NET体系结构 26.2.4. 使用MySQL Connector/NET 26.2.5. MySQL Connector/NET变更史 26.3. MySQL Connector/J 26.3.1. 基本的JDBC概念 26.3.2. 安装 Connector/J 26.3.3. JDBC引用 26.3.4. 与J2EE和其他Java框架一起使用 Connector/J 26.3.5. 诊断 Connector/J方面的问题 26.3.6. Changelog 26.4. MySQL Connector/MXJ 26.4.1. 前言 26.4.2. 支持平台: 26.4.3. Junit测试要求 26.4.4. 运行Junit测试 26.4.5. 作为JDBC驱动程序的一部分运行 26.4.6. 在Java对象运行 26.4.7. MysqldResource API 26.4.8. 在JMX代理(custom)运行 26.4.9. 部署在标准的JMX代理环境下 (JBoss) 26.4.10. 安装 27. 扩展MySQL 27.1. MySQL内部控件 27.1.1. MySQL线程 27.1.2. MySQL测试套件 27.2. 为MySQL添加新函数 27.2.1. 自定义函数接口的特性 27.2.2. CREATE FUNCTION/DROP FUNCTION语法 27.2.3. 添加新的自定义函数 27.2.4. 添加新的固有函数 27.3. 为MySQL添加新步骤 27.3.1. 步骤分析 27.3.2. 编写步骤 A. 问题和常见错误 A.1. 如何确定导致问题的原因 A.2. 使用MySQL程序时的常见错误 A.2.1. 拒绝访问 A.2.2. 无法连接到[local] MySQL服务器 A.2.3. 客户端不支持鉴定协议 A.2.4. 输入密码时出现密码错误 A.2.5. 主机的host_name被屏蔽 A.2.6. 连接数过多 A.2.7. 内存溢出 A.2.8. MySQL服务器不可用 A.2.9. 信息包过大 A.2.10. 通信错误和失效连接 A.2.11. 表已满 A.2.12. 无法创建文件/写入文件 A.2.13. 命令不同步 A.2.14. 忽略用户 A.2.15. 表tbl_name不存在 A.2.16. 无法初始化字符集 A.2.17. 文件未找到 A.3. 与安装有关的事宜 A.3.1. 与MySQL客户端库的链接问题 A.3.2. 如何以普通用户身份运行MySQL A.3.3. 与文件许可有关的问题 A.4. 与管理有关的事宜 A.4.1. 如何复位根用户密码 A.4.2. 如果MySQL依然崩溃,应作些什么 A.4.3. MySQL处理磁盘满的方式 A.4.4. MySQL将临时文件储存在哪里 A.4.5. 如何保护或更改MySQL套接字文件/tmp/mysql.sock A.4.6. 时区问题 A.5. 与查询有关的事宜 A.5.1. 搜索的大小写敏感性 A.5.2. 使用DATE列方面的问题 A.5.3. 与NULL值有关的问题 A.5.4. 与列别名有关的问题 A.5.5. 非事务表回滚失败 A.5.6. 从相关表删除行 A.5.7. 解决与不匹配行有关的问题 A.5.8. 与浮点比较有关的问题 A.6. 与优化器有关的事宜 A.7. 与表定义有关的事宜 A.7.1. 与ALTER TABLE有关的问题 A.7.2. 如何更改表的列顺序 A.7.3. TEMPORARY TABLE问题 A.8. MySQL的已知事宜 A.8.1. MySQL的打开事宜 B. 错误代码和消息 B.1. 服务器错误代码和消息 B.2. 客户端错误代码和消息 C. 感谢 C.1. MySQL AB处的开发人 C.2. MySQL贡献人 C.3. 资料员和译员 C.4. MySQL使用和包含的库 C.5. 支持MySQL的软件包 C.6. 用于创建MySQL的工具 C.7. MySQL支持人员 D. MySQL变更史 D.1. 5.1.x版的变更情况(开发) D.1.1. 5.1.2版的变更情况(尚未发布) D.1.2. 5.1.1版的变更情况(尚未发布) D.2. MyODBC的变更情况 D.2.1. MyODBC 3.51.12的变更情况 D.2.2. MyODBC 3.51.11的变更情况 E. 移植到其他系统 E.1. 调试MySQL服务器 E.1.1. 针对调试编译MySQL E.1.2. 创建跟踪文件 E.1.3. 在gdb环境下调试mysqld E.1.4. 使用堆栈跟踪 E.1.5. 使用日志文件找出mysqld的错误原因 E.1.6. 如果出现表崩溃,请生成测试案例 E.2. 调试MySQL客户端 E.3. DBUG软件包 E.4. 关于RTS线程的注释 E.5. 线程软件包之间的差异 F. 环境变量 G. MySQL正则表达式 H. MySQL的限制 H.1. 联合的限制 I. 特性限制 I.1. 对存储子程序和触发程序的限制 I.2. 对服务器端光标的限制 I.3. 对子查询的限制 I.4. 对视图的限制 I.5. 对XA事务的限制 J. GNU通用公共许可 K. MySQL FLOSS许可例外 索引 图形清单 14.1. MySQL插件式存储引擎的体系结构 14.2. 存储引擎比较 16.1. MySQL体系结构 表格清单 26.1. 连接属性 26.2. 转换表 26.3. 用于ResultSet.getObject()的MySQL类型和Java类型 26.4. MySQL对Java编码名称的翻译 示例清单 26.1. 从DriverManager获得连接 26.2. 使用java.sql.Statement执行SELECT查询 26.3. 存储程序示例 26.4. 使用Connection.prepareCall() 26.5. 注册输出参数 26.6. 设置CallableStatement输入参数 26.7. 检索结果和输出参数值 26.8. 使用Statement.getGeneratedKeys()检索AUTO_INCREMENT列的值 26.9. 使用SELECT LAST_INSERT_ID()检索AUTO_INCREMENT列的值 26.10. 在可更新的ResultSets检索AUTO_INCREMENT列的值 26.11. 设置Unix环境下的CLASSPATH 26.12. 与J2EE应用服务器一起使用连接池 26.13. 重试逻辑的事务示例
目录<br><br>前言<br>1. 一般信息<br>1.1. 关于本手册<br>1.2. 本手册采用的惯例<br>1.3. MySQL AB概述<br>1.4. MySQL数据库管理系统概述<br>1.4.1. MySQL的历史<br>1.4.2. MySQL的的主要特性<br>1.4.3. MySQL稳定性<br>1.4.4. MySQL表最大能达到多少<br>1.4.5. 2000年兼容性<br>1.5. MaxDB数据库管理系统概述<br>1.5.1. 什么是MaxDB?<br>1.5.2. MaxDB的历史<br>1.5.3. MaxDB的特性<br>1.5.4. 许可和支持<br>1.5.5. MaxDB和MySQL之间的特性差异<br>1.5.6. MaxDB和MySQL之间的协同性<br>1.5.7. 与MaxDB有关的链接<br>1.6. MySQL发展大事记<br>1.6.1. MySQL 5.1的新特性<br>1.7. MySQL信息源<br>1.7.1. MySQL邮件列表<br>1.7.2. IRC(在线聊天系统)上的MySQL社区支持<br>1.7.3. MySQL论坛上的MySQL社区支持<br>1.8. MySQL标准的兼容性<br>1.8.1. MySQL遵从的标准是什么<br>1.8.2. 选择SQL模式<br>1.8.3. 在ANSI模式下运行MySQL<br>1.8.4. MySQL对标准SQL的扩展<br>1.8.5. MySQL与标准SQL的差别<br>1.8.6. MySQL处理约束的方式<br>2. 安装MySQL<br>2.1. 一般安装问题<br>2.1.1. MySQL支持的操作系统<br>2.1.2. 选择要安装的MySQL分发版<br>2.1.3. 怎样获得MySQL<br>2.1.4. 通过MD5校验和或GnuPG验证软件包的完整性<br>2.1.5. 安装布局<br>2.2. 使用二进制分发版的标准MySQL安装<br>2.3. 在Windows上安装MySQL<br>2.3.1. Windows系统要求<br>2.3.2. 选择安装软件包<br>2.3.3. 用自动安装器安装MySQL<br>2.3.4. 使用MySQL安装向导<br>2.3.5. 使用配置向导<br>2.3.6. 通过非安装Zip文件安装MySQL<br>2.3.7. 提取安装档案文件<br>2.3.8. 创建选项文件<br>2.3.9. 选择MySQL服务器类型<br>2.3.10. 首次启动服务器<br>2.3.11. 从Windows命令行启动MySQL<br>2.3.12. 以Windows服务方式启动MySQL<br>2.3.13. 测试MySQL安装<br>2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除<br>2.3.15. 在Windows下升级MySQL<br>2.3.16. Windows版MySQL同Unix版MySQL对比<br>2.4. 在Linux下安装MySQL<br>2.5.在Mac OS X安装MySQL<br>2.6. 在NetWare安装MySQL<br>2.7. 在其它类Unix系统安装MySQL<br>2.8. 使用源码分发版安装MySQL<br>2.8.1. 源码安装概述<br>2.8.2. 典型配置选项<br>2.8.3. 从开发源码树安装<br>2.8.4. 处理MySQL编译问题<br>2.8.5. MIT-pthreads注意事项<br>2.8.6. 在Windows下从源码安装MySQL<br>2.8.7. 在Windows下编译MySQL客户端<br>2.9. 安装后的设置和测试<br>2.9.1. Windows下安装后的过程<br>2.9.2. Unix下安装后的过程<br>2.9.3. 使初始MySQL账户安全<br>2.10. 升级MySQL<br>2.10.1. 从5.0版升级<br>2.10.2. 升级授权表<br>2.10.3. 将MySQL数据库拷贝到另一台机器<br>2.11. 降级MySQL<br>2.12. 具体操作系统相关的注意事项<br>2.12.1. Linux注意事项<br>2.12.2. Mac OS X注意事项<br>2.12.3. Solaris注意事项<br>2.12.4. BSD注意事项<br>2.12.5. 其它Unix注意事项<br>2.12.6. OS/2注意事项<br>2.13. Perl安装注意事项<br>2.13.1. 在Unix安装Perl<br>2.13.2. 在Windows下安装ActiveState Perl<br>2.13.3. 使用Perl DBI/DBD接口的问题<br>3. 教程<br>3.1. 连接与断开服务器<br>3.2. 输入查询<br>3.3. 创建并使用数据库<br>3.3.1. 创建并选择数据库<br>3.3.2. 创建表<br>3.3.3. 将数据装入表<br>3.3.4. 从表检索信息<br>3.4. 获得数据库和表的信息<br>3.5. 在批处理模式下使用mysql<br>3.6. 常用查询的例子<br>3.6.1. 列的最大值<br>3.6.2. 拥有某个列的最大值的行<br>3.6.3. 列的最大值:按组<br>3.6.4. 拥有某个字段的组间最大值的行<br>3.6.5. 使用用户变量<br>3.6.6. 使用外键<br>3.6.7. 根据两个键搜索<br>3.6.8. 根据天计算访问量<br>3.6.9. 使用AUTO_INCREMENT<br>3.7. 孪生项目的查询<br>3.7.1. 查找所有未分发的孪生项<br>3.7.2. 显示孪生对状态的表<br>3.8. 与Apache一起使用MySQL<br>4. MySQL程序概述<br>4.1. MySQL程序概述<br>4.2. 调用MySQL程序<br>4.3. 指定程序选项<br>4.3.1. 在命令行上使用选项<br>4.3.2. 使用选项文件<br>4.3.3. 用环境变量指定选项<br>4.3.4. 使用选项设置程序变量<br>5. 数据库管理<br>5.1. MySQL服务器和服务器启动脚本<br>5.1.1. 服务器端脚本和实用工具概述<br>5.1.2. mysqld-max扩展MySQL服务器<br>5.1.3. mysqld_safe:MySQL服务器启动脚本<br>5.1.4. mysql.server:MySQL服务器启动脚本<br>5.1.5. mysqld_multi:管理多个MySQL服务器的程序<br>5.2. mysqlmanager:MySQL实例管理器<br>5.2.1. 用MySQL实例管理器启动MySQL服务器<br>5.2.2. 连接到MySQL实例管理器并创建用户账户<br>5.2.3. MySQL实例管理器命令行选项<br>5.2.4. MySQL实例管理器配置文件<br>5.2.5. MySQL实例管理器识别的命令<br>5.3. mysqld:MySQL服务器<br>5.3.1. mysqld命令行选项<br>5.3.2. SQL服务器模式<br>5.3.3. 服务器系统变量<br>5.3.4. 服务器状态变量<br>5.4. mysql_fix_privilege_tables:升级MySQL系统表<br>5.5. MySQL服务器关机进程<br>5.6. 一般安全问题<br>5.6.1. 通用安全指南<br>5.6.2. 使MySQL在攻击者面前保持安全<br>5.6.3. Mysqld安全相关启动选项<br>5.6.4. LOAD DATA LOCAL安全问题<br>5.7. MySQL访问权限系统<br>5.7.1. 权限系统的作用<br>5.7.2. 权限系统工作原理<br>5.7.3. MySQL提供的权限<br>5.7.4. 与MySQL服务器连接<br>5.7.5. 访问控制, 阶段1:连接核实<br>5.7.6. 访问控制, 阶段2:请求核实<br>5.7.7. 权限更改何时生效<br>5.7.8. 拒绝访问错误的原因<br>5.7.9. MySQL 4.1的密码哈希处理<br>5.8. MySQL用户账户管理<br>5.8.1. MySQL用户名和密码<br>5.8.2. 向MySQL增加新用户账户<br>5.8.3. 从MySQL删除用户账户<br>5.8.4. 限制账户资源<br>5.8.5. 设置账户密码<br>5.8.6. 使你的密码安全<br>5.8.7. 使用安全连接<br>5.9. 备份与恢复<br>5.9.1. 数据库备份<br>5.9.2. 示例用备份与恢复策略<br>5.9.3. 自动恢复<br>5.9.4. 表维护和崩溃恢复<br>5.9.5. myisamchk:MyISAM表维护实用工具<br>5.9.6. 建立表维护计划<br>5.9.7. 获取关于表的信息<br>5.10. MySQL本地化和国际应用<br>5.10.1. 数据和排序用字符集<br>5.10.2. 设置错误消息语言<br>5.10.3. 添加新的字符集<br>5.10.4. 字符定义数组<br>5.10.5. 字符串比较支持<br>5.10.6. 多字节字符支持<br>5.10.7. 字符集问题<br>5.10.8. MySQL服务器时区支持<br>5.11. MySQL日志文件<br>5.11.1. 错误日志<br>5.11.2. 通用查询日志<br>5.11.3. 二进制日志<br>5.11.4. 慢速查询日志<br>5.11.5. 日志文件维护<br>5.12. 在同一台机器上运行多个MySQL服务器<br>5.12.1. 在Windows下运行多个服务器<br>5.12.2. 在Unix运行多个服务器<br>5.12.3. 在多服务器环境使用客户端程序<br>5.13. MySQL查询高速缓冲<br>5.13.1. 查询高速缓冲如何工作<br>5.13.2. 查询高速缓冲SELECT选项<br>5.13.3. 查询高速缓冲配置<br>5.13.4. 查询高速缓冲状态和维护<br>6. MySQL的复制<br>6.1. 复制介绍<br>6.2. 复制实施概述<br>6.3. 复制实施细节<br>6.3.1. 复制主线程状态<br>6.3.2. 复制从I/O线程状态<br>6.3.3. 复制从SQL线程状态<br>6.3.4. 复制传递和状态文件<br>6.4. 如何设置复制<br>6.5. 不同MySQL版本之间的复制兼容性<br>6.6. 升级复制设置<br>6.6.1. 将复制升级到5.0版<br>6.7. 复制特性和已知问题<br>6.8. 复制启动选项<br>6.9. 复制FAQ<br>6.10. 复制故障诊断与排除<br>6.11. 通报复制缺陷<br>6.12. 多服务器复制的Auto-Increment<br>7. 优化<br>7.1. 优化概述<br>7.1.1. MySQL设计局限与折衷<br>7.1.2. 为可移植性设计应用程序<br>7.1.3. 我们已将MySQL用在何处?<br>7.1.4. MySQL基准套件<br>7.1.5. 使用自己的基准<br>7.2. 优化SELECT语句和其它查询<br>7.2.1. EXPLAIN语法(获取SELECT相关信息)<br>7.2.2. 估计查询性能<br>7.2.3. SELECT查询的速度<br>7.2.4. MySQL怎样优化WHERE子句<br>7.2.5. 范围优化<br>7.2.6. 索引合并优化<br>7.2.7. MySQL如何优化IS NULL<br>7.2.8. MySQL如何优化DISTINCT<br>7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN<br>7.2.10. MySQL如何优化嵌套Join<br>7.2.11. MySQL如何简化外部联合<br>7.2.12. MySQL如何优化ORDER BY<br>7.2.13. MySQL如何优化GROUP BY<br>7.2.14. MySQL如何优化LIMIT<br>7.2.15. 如何避免表扫描<br>7.2.16. INSERT语句的速度<br>7.2.17. UPDATE语句的速度<br>7.2.18. DELETE语句的速度<br>7.2.19. 其它优化技巧<br>7.3. 锁定事宜<br>7.3.1. 锁定方法<br>7.3.2. 表锁定事宜<br>7.4. 优化数据库结构<br>7.4.1. 设计选择<br>7.4.2. 使你的数据尽可能小<br>7.4.3. 列索引<br>7.4.4. 多列索引<br>7.4.5. MySQL如何使用索引<br>7.4.6. MyISAM键高速缓冲<br>7.4.7. MyISAM索引统计集合<br>7.4.8. MySQL如何计算打开的表<br>7.4.9. MySQL如何打开和关闭表<br>7.4.10. 在同一个数据库创建多个表的缺陷<br>7.5. 优化MySQL服务器<br>7.5.1. 系统因素和启动参数的调节<br>7.5.2. 调节服务器参数<br>7.5.3. 控制查询优化器的性能<br>7.5.4. 编译和链接怎样影响MySQL的速度<br>7.5.5. MySQL如何使用内存<br>7.5.6. MySQL如何使用DNS<br>7.6. 磁盘事宜<br>7.6.1. 使用符号链接<br>8. 客户端和实用工具程序<br>8.1. 客户端脚本和实用工具概述<br>8.2. myisampack:生成压缩、只读MyISAM表<br>8.3. mysql:MySQL命令行工具<br>8.3.1. 选项<br>8.3.2. mysql命令<br>8.3.3. 怎样从文本文件执行SQL语句<br>8.3.4. mysql技巧<br>8.4. mysqlaccess:用于检查访问权限的客户端<br>8.5. mysqladmin:用于管理MySQL服务器的客户端<br>8.6. mysqlbinlog:用于处理二进制日志文件的实用工具<br>8.7. mysqlcheck:表维护和维修程序<br>8.8. mysqldump:数据库备份程序<br>8.9. mysqlhotcopy:数据库备份程序<br>8.10. mysqlimport:数据导入程序<br>8.11. mysqlshow-显示数据库、表和列信息<br>8.12. myisamlog:显示MyISAM日志文件内容<br>8.13. perror:解释错误代码<br>8.14. replace:字符串替换实用工具<br>8.15. mysql_zap:杀死符合某一模式的进程<br>9. 语言结构<br>9.1. 文字值<br>9.1.1. 字符串<br>9.1.2. 数值<br>9.1.3. 十六进制值<br>9.1.4. 布尔值<br>9.1.5. 位字段值<br>9.1.6. NULL值<br>9.2. 数据库、表、索引、列和别名<br>9.2.1. 识别符限制条件<br>9.2.2. 识别符大小写敏感性<br>9.3. 用户变量<br>9.4. 系统变量<br>9.4.1. 结构式系统变量<br>9.5. 注释语法<br>9.6. MySQL保留字的处理<br>10. 字符集支持<br>10.1. 常规字符集和校对<br>10.2. MySQL的字符集和校对<br>10.3. 确定默认字符集和校对<br>10.3.1. 服务器字符集和校对<br>10.3.2. 数据库字符集和校对<br>10.3.3. 表字符集和校对<br>10.3.4. 列字符集和校对<br>10.3.5. 字符集和校对分配示例<br>10.3.6. 连接字符集和校对<br>10.3.7. 字符串文字字符集和校对<br>10.3.8. 在SQL语句使用COLLATE<br>10.3.9. COLLATE子句优先<br>10.3.10. BINARY操作符<br>10.3.11. 校对确定较为复杂的一些特殊情况<br>10.3.12. 校对必须适合字符集<br>10.3.13. 校对效果的示例<br>10.4. 字符集支持影响到的操作<br>10.4.1. 结果字符串<br>10.4.2. CONVERT()<br>10.4.3. CAST()<br>10.4.4. SHOW语句<br>10.5. Unicode支持<br>10.6. 用于元数据的UTF8<br>10.7. 与其它DBMS的兼容性<br>10.8. 新字符集配置文件格式<br>10.9. 国家特有字符集<br>10.10. MySQL支持的字符集和校对<br>10.10.1. Unicode字符集<br>10.10.2. 西欧字符集<br>10.10.3. 欧字符集<br>10.10.4. 南欧与东字符集<br>10.10.5. 波罗的海字符集<br>10.10.6. 西里尔字符集<br>10.10.7. 亚洲字符集<br>11. 列类型<br>11.1. 列类型概述<br>11.1.1. 数值类型概述<br>11.1.2. 日期和时间类型概述<br>11.1.3. 字符串类型概述<br>11.2. 数值类型<br>11.3. 日期和时间类型<br>11.3.1. DATETIME、DATE和TIMESTAMP类型<br>11.3.2. TIME类型<br>11.3.3. YEAR类型<br>11.3.4. Y2K事宜和日期类型<br>11.4. String类型<br>11.4.1. CHAR和VARCHAR类型<br>11.4.2. BINARY和VARBINARY类型<br>11.4.3. BLOB和TEXT类型<br>11.4.4. ENUM类型<br>11.4.5. SET类型<br>11.5. 列类型存储需求<br>11.6. 选择正确的列类型<br>11.7. 使用来自其他数据库引擎的列类型<br>12. 函数和操作符<br>12.1. 操作符<br>12.1.1. 操作符优先级<br>12.1.2. 圆括号<br>12.1.3. 比较函数和操作符<br>12.1.4. 逻辑操作符<br>12.2. 控制流程函数<br>12.3. 字符串函数<br>12.3.1. 字符串比较函数<br>12.4. 数值函数<br>12.4.1. 算术操作符<br>12.4.2. 数学函数<br>12.5. 日期和时间函数<br>12.6. MySQL使用什么日历?<br>12.7. 全文搜索功能<br>12.7.1. 布尔全文搜索<br>12.7.2. 全文搜索带查询扩展<br>12.7.3. 全文停止字<br>12.7.4. 全文限定条件<br>12.7.5. 微调MySQL全文搜索<br>12.8. Cast函数和操作符<br>12.9. 其他函数<br>12.9.1. 位函数<br>12.9.2. 加密函数<br>12.9.3. 信息函数<br>12.9.4. 其他函数<br>12.10. 与GROUP BY子句同时使用的函数和修改程序<br>12.10.1. GROUP BY(聚合)函数<br>12.10.2. GROUP BY修改程序<br>12.10.3. 具有隐含字段的GROUP BY<br>13. SQL语句语法<br>13.1. 数据定义语句<br>13.1.1. ALTER DATABASE语法<br>13.1.2. ALTER TABLE语法<br>13.1.3. CREATE DATABASE语法<br>13.1.4. CREATE INDEX语法<br>13.1.5. CREATE TABLE语法<br>13.1.6. DROP DATABASE语法<br>13.1.7. DROP INDEX语法<br>13.1.8. DROP TABLE语法<br>13.1.9. RENAME TABLE语法<br>13.2. 数据操作语句<br>13.2.1. DELETE语法<br>13.2.2. DO语法<br>13.2.3. HANDLER语法<br>13.2.4. INSERT语法<br>13.2.5. LOAD DATA INFILE语法<br>13.2.6. REPLACE语法<br>13.2.7. SELECT语法<br>13.2.8. Subquery语法<br>13.2.9. TRUNCATE语法<br>13.2.10. UPDATE语法<br>13.3. MySQL实用工具语句<br>13.3.1. DESCRIBE语法(获取有关列的信息)<br>13.3.2. USE语法<br>13.4. MySQL事务处理和锁定语句<br>13.4.1. START TRANSACTION, COMMIT和ROLLBACK语法<br>13.4.2. 不能回滚的语句<br>13.4.3. 会造成隐式提交的语句<br>13.4.4. SAVEPOINT和ROLLBACK TO SAVEPOINT语法<br>13.4.5. LOCK TABLES和UNLOCK TABLES语法<br>13.4.6. SET TRANSACTION语法<br>13.4.7. XA事务<br>13.5. 数据库管理语句<br>13.5.1. 账户管理语句<br>13.5.2. 表维护语句<br>13.5.3. SET语法<br>13.5.4. SHOW语法<br>13.5.5. 其它管理语句<br>13.6. 复制语句<br>13.6.1. 用于控制主服务器的SQL语句<br>13.6.2. 用于控制从服务器的SQL语句<br>13.7. 用于预处理语句的SQL语法<br>14. 插件式存储引擎体系结构<br>14.1. 前言<br>14.2. 概述<br>14.3. 公共MySQL数据库服务器层<br>14.4. 选择存储引擎<br>14.5. 将存储引擎指定给表<br>14.6. 存储引擎和事务<br>14.7. 插入存储引擎<br>14.8. 拔出存储引擎<br>14.9. 插件式存储器的安全含义<br>15. 存储引擎和表类型<br>15.1. MyISAM存储引擎<br>15.1.1. MyISAM启动选项<br>15.1.2. 键所需的空间<br>15.1.3. MyISAM表的存储格式<br>15.1.4. MyISAM表方面的问题<br>15.2. InnoDB存储引擎<br>15.2.1. InnoDB概述<br>15.2.2. InnoDB联系信息<br>15.2.3. InnoDB配置<br>15.2.4. InnoDB启动选项<br>15.2.5. 创建InnoDB表空间<br>15.2.6. 创建InnoDB表<br>15.2.7. 添加和删除InnoDB数据和日志文件<br>15.2.8. InnoDB数据库的备份和恢复<br>15.2.9. 将InnoDB数据库移到另一台机器上<br>15.2.10. InnoDB事务模型和锁定<br>15.2.11. InnoDB性能调节提示<br>15.2.12. 多版本的实施<br>15.2.13. 表和索引结构<br>15.2.14. 文件空间管理和磁盘I/O<br>15.2.15. InnoDB错误处理<br>15.2.16. 对InnoDB表的限制<br>15.2.17. InnoDB故障诊断与排除<br>15.3. MERGE存储引擎<br>15.3.1. MERGE表方面的问题<br>15.4. MEMORY (HEAP)存储引擎<br>15.5. BDB (BerkeleyDB)存储引擎<br>15.5.1. BDB支持的操作系统<br>15.5.2. 安装BDB<br>15.5.3. BDB启动选项<br>15.5.4. BDB表的特性<br>15.5.5. 修改BDB所需的事宜<br>15.5.6. 对BDB表的限制<br>15.5.7. 使用BDB表时可能出现的错误<br>15.6. EXAMPLE存储引擎<br>15.7. FEDERATED存储引擎<br>15.7.1. 安装FEDERATED存储引擎<br>15.7.2. FEDERATED存储引擎介绍<br>15.7.3. 如何使用FEDERATED表<br>15.7.4. FEDERATED存储引擎的局限性<br>15.8. ARCHIVE存储引擎<br>15.9. CSV存储引擎<br>15.10. BLACKHOLE存储引擎<br>16. 编写自定义存储引擎<br>16.1. 前言<br>16.2. 概述<br>16.3. 创建存储引擎源文件<br>16.4. 创建handlerton<br>16.5. 对处理程序进行实例化处理<br>16.6. 定义表扩展<br>16.7. 创建表<br>16.8. 打开表<br>16.9. 实施基本的表扫描功能<br>16.9.1. 实施store_lock()函数<br>16.9.2. 实施external_lock()函数<br>16.9.3. 实施rnd_init()函数<br>16.9.4. 实施info()函数<br>16.9.5. 实施extra()函数<br>16.9.6. 实施rnd_next()函数<br>16.10. 关闭表<br>16.11. 为存储引擎添加对INSERT的支持<br>16.12. 为存储引擎添加对UPDATE的支持<br>16.13. 为存储引擎添加对DELETE的支持<br>16.14. API引用<br>16.14.1. bas_ext<br>16.14.2. close<br>16.14.3. create<br>16.14.4. delete_row<br>16.14.5. delete_table<br>16.14.6. external_lock<br>16.14.7. extra<br>16.14.8. info<br>16.14.9. open<br>16.14.10. rnd_init<br>16.14.11. rnd_next<br>16.14.12. store_lock<br>16.14.13. update_row<br>16.14.14. write_row<br>17. MySQL簇<br>17.1. MySQL簇概述<br>17.2. MySQL簇的基本概念<br>17.3. 多计算机的简单基础知识<br>17.3.1. 硬件、软件和联网<br>17.3.2. 安装<br>17.3.3. 配置<br>17.3.4. 首次启动<br>17.3.5. 加载示例数据并执行查询<br>17.3.6. 安全关闭和重启<br>17.4. MySQL簇的配置<br>17.4.1. 从源码创建MySQL簇<br>17.4.2. 安装软件<br>17.4.3. MySQL簇的快速测试设置<br>17.4.4. 配置文件<br>17.5. MySQL簇的进程管理<br>17.5.1. 用于MySQL簇的MySQL服务器进程使用<br>17.5.2. ndbd,存储引擎节点进程<br>17.5.3. ndb_mgmd,“管理服务器”进程<br>17.5.4. ndb_mgm,“管理客户端”进程<br>17.5.5. 用于MySQL簇进程的命令选项<br>17.6. MySQL簇的管理<br>17.6.1. MySQL簇的启动阶段<br>17.6.2. “管理客户端”的命令<br>17.6.3. MySQL簇生成的事件报告<br>17.6.4. 单用户模式<br>17.6.5. MySQL簇的联机备份<br>17.7. 使用与MySQL簇的高速互连<br>17.7.1. 配置MySQL簇以使用SCI套接字<br>17.7.2. 理解簇互连的影响<br>17.8. MySQL簇的已知限制<br>17.9. MySQL簇发展的重要历程<br>17.9.1. MySQL 5.0的MySQL簇变化<br>17.9.2. 关于MySQL簇的MySQL 5.1发展历程<br>17.10. MySQL簇常见问题解答<br>17.11. MySQL簇术语表<br>18. 分区<br>18.1. MySQL的分区概述<br>18.2. 分区类型<br>18.2.1. RANGE分区<br>18.2.2. LIST分区<br>18.2.3. HASH分区<br>18.2.4. KEY分区<br>18.2.5. 子分区<br>18.2.6. MySQL分区处理NULL值的方式<br>18.3. 分区管理<br>18.3.1. RANGE和LIST分区的管理<br>18.3.2. HASH和KEY分区的管理<br>18.3.3. 分区维护<br>18.3.4. 获取关于分区的信息<br>19. MySQL的空间扩展<br>19.1. 前言<br>19.2. OpenGIS几何模型<br>19.2.1. Geometry类的层次<br>19.2.2. 类Geometry<br>19.2.3. 类Point<br>19.2.4. 类Curve<br>19.2.5. 类LineString<br>19.2.6. 类Surface<br>19.2.7. 类Polygon<br>19.2.8. 类GeometryCollection<br>19.2.9. 类MultiPoint<br>19.2.10. 类MultiCurve<br>19.2.11. 类MultiLineString<br>19.2.12. 类MultiSurface<br>19.2.13. 类MultiPolygon<br>19.3. 支持的空间数据格式<br>19.3.1. 著名的文本(WKT)格式<br>19.3.2. 著名的二进制(WKB)格式<br>19.4. 创建具备空间功能的MySQL数据库<br>19.4.1. MySQL空间数据类型<br>19.4.2. 创建空间值<br>19.4.3. 创建空间列<br>19.4.4. 填充空间列<br>19.4.5. 获取空间数据<br>19.5. 分析空间信息<br>19.5.1. Geometry格式转换函数<br>19.5.2. Geometry函数<br>19.5.3. 从已有Geometry创建新Geometry的函数<br>19.5.4. 测试几何对象间空间关系的函数<br>19.5.5. 关于几何最小边界矩形(MBR)的关系<br>19.5.6. 测试几何类之间空间关系的函数<br>19.6. 优化空间分析<br>19.6.1. 创建空间索引<br>19.6.2. 使用空间索引<br>19.7. MySQL的一致性和兼容性<br>19.7.1. 尚未实施的GIS特性<br>20. 存储程序和函数<br>20.1. 存储程序和授权表<br>20.2. 存储程序的语法<br>20.2.1. CREATE PROCEDURE和CREATE FUNCTION<br>20.2.2. ALTER PROCEDURE和ALTER FUNCTION<br>20.2.3. DROP PROCEDURE和DROP FUNCTION<br>20.2.4. SHOW CREATE PROCEDURE和SHOW CREATE FUNCTION<br>20.2.5. SHOW PROCEDURE STATUS和SHOW FUNCTION STATUS<br>20.2.6. CALL语句<br>20.2.7. BEGIN ... END复合语句<br>20.2.8. DECLARE语句<br>20.2.9. 存储程序的变量<br>20.2.10. 条件和处理程序<br>20.2.11. 光标<br>20.2.12. 流程控制构造<br>20.3. 存储程序、函数、触发程序和复制:常见问题<br>20.4. 存储子程序和触发程序的二进制日志功能<br>21. 触发程序<br>21.1. CREATE TRIGGER语法<br>21.2. DROP TRIGGER语法<br>21.3. 使用触发程序<br>22. 视图<br>22.1. ALTER VIEW语法<br>22.2. CREATE VIEW语法<br>22.3. DROP VIEW语法<br>22.4. SHOW CREATE VIEW语法<br>23. INFORMATION_SCHEMA信息数据库<br>23.1. INFORMATION_SCHEMA表<br>23.1.1. INFORMATION_SCHEMA SCHEMATA表<br>23.1.2. INFORMATION_SCHEMA TABLES表<br>23.1.3. INFORMATION_SCHEMA COLUMNS表<br>23.1.4. INFORMATION_SCHEMA STATISTICS表<br>23.1.5. INFORMATION_SCHEMA USER_PRIVILEGES表<br>23.1.6. INFORMATION_SCHEMA SCHEMA_PRIVILEGES表<br>23.1.7. INFORMATION_SCHEMA TABLE_PRIVILEGES表<br>23.1.8. INFORMATION_SCHEMA COLUMN_PRIVILEGES表<br>23.1.9. INFORMATION_SCHEMA CHARACTER_SETS表<br>23.1.10. INFORMATION_SCHEMA COLLATIONS表<br>23.1.11. INFORMATION_SCHEMA COLLATION_CHARACTER_SET_APPLICABILITY表<br>23.1.12. INFORMATION_SCHEMA TABLE_CONSTRAINTS表<br>23.1.13. INFORMATION_SCHEMA KEY_COLUMN_USAGE表<br>23.1.14. INFORMATION_SCHEMA ROUTINES表<br>23.1.15. INFORMATION_SCHEMA VIEWS表<br>23.1.16. INFORMATION_SCHEMA TRIGGERS表<br>23.1.17. 其他INFORMATION_SCHEMA表<br>23.2. SHOW语句的扩展<br>24. 精度数学<br>24.1. 数值的类型<br>24.2. DECIMAL数据类型更改<br>24.3. 表达式处理<br>24.4. 四舍五入<br>24.5. 精度数学示例<br>25. API和库<br>25.1. libmysqld,嵌入式MySQL服务器库<br>25.1.1. 嵌入式MySQL服务器库概述<br>25.1.2. 使用libmysqld编译程序<br>25.1.3. 使用嵌入式MySQL服务器时的限制<br>25.1.4. 与嵌入式服务器一起使用的选项<br>25.1.5. 嵌入式服务器尚需完成的事项(TODO)<br>25.1.6. 嵌入式服务器示例<br>25.1.7. 嵌入式服务器的许可<br>25.2. MySQL C API<br>25.2.1. C API数据类型<br>25.2.2. C API函数概述<br>25.2.3. C API函数描述<br>25.2.4. C API预处理语句<br>25.2.5. C API预处理语句的数据类型<br>25.2.6. C API预处理语句函数概述<br>25.2.7. C API预处理语句函数描述<br>25.2.8. C API预处理语句方面的问题<br>25.2.9. 多查询执行的C API处理<br>25.2.10. 日期和时间值的C API处理<br>25.2.11. C API线程函数介绍<br>25.2.12. C API嵌入式服务器函数介绍<br>25.2.13. 使用C API时的常见问题<br>25.2.14. 创建客户端程序<br>25.2.15. 如何生成线程式客户端<br>25.3. MySQL PHP API<br>25.3.1. 使用MySQL和PHP的常见问题<br>25.4. MySQL Perl API<br>25.5. MySQL C++ API<br>25.5.1. Borland C++<br>25.6. MySQL Python API<br>25.7. MySQL Tcl API<br>25.8. MySQL Eiffel Wrapper<br>25.9. MySQL程序开发实用工具<br>25.9.1. msql2mysql:转换mSQL程序以用于MySQL<br>25.9.2. mysql_config:获取编译客户端的编译选项<br>26. 连接器<br>26.1. MySQL Connector/ODBC<br>26.1.1. MyODBC介绍<br>26.1.2. 关于ODBC和MyODBC的一般信息<br>26.1.3. 如何安装MyODBC<br>26.1.4. 在Windows平台上从二进制版本安装MyODBC<br>26.1.5. I在Unix平台上从二进制版本安装MyODBC <br>26.1.6. 在Windows平台上从源码版本安装MyODBC<br>26.1.7. 在Unix平台上从源码版本安装MyODBC <br>26.1.8. 从BitKeeper开发源码树安装MyODBC<br>26.1.9. MyODBC配置<br>26.1.10. 与MyODBC连接相关的事宜<br>26.1.11. MyODBC和Microsoft Access<br>26.1.12. MyODBC和Microsoft VBA及ASP<br>26.1.13. MyODBC和第三方ODBC工具<br>26.1.14. MyODBC通用功能<br>26.1.15. 基本的MyODBC应用步骤<br>26.1.16. MyODBC API引用<br>26.1.17. MyODBC数据类型<br>26.1.18. MyODBC错误代码<br>26.1.19. MyODBC与VB:ADO、DAO和RDO<br>26.1.20. MyODBC与Microsoft.NET<br>26.1.21. 感谢<br>26.2. MySQL Connector/NET<br>26.2.1. 前言<br>26.2.2. 下载并安装MySQL Connector/NET<br>26.2.3. Connector/NET体系结构<br>26.2.4. 使用MySQL Connector/NET<br>26.2.5. MySQL Connector/NET变更史<br>26.3. MySQL Connector/J<br>26.3.1. 基本的JDBC概念<br>26.3.2. 安装 Connector/J<br>26.3.3. JDBC引用<br>26.3.4. 与J2EE和其他Java框架一起使用 Connector/J<br>26.3.5. 诊断 Connector/J方面的问题<br>26.3.6. Changelog<br>26.4. MySQL Connector/MXJ<br>26.4.1. 前言<br>26.4.2. 支持平台:<br>26.4.3. Junit测试要求<br>26.4.4. 运行Junit测试<br>26.4.5. 作为JDBC驱动程序的一部分运行<br>26.4.6. 在Java对象运行<br>26.4.7. MysqldResource API<br>26.4.8. 在JMX代理(custom)运行<br>26.4.9. 部署在标准的JMX代理环境下 (JBoss)<br>26.4.10. 安装<br>27. 扩展MySQL<br>27.1. MySQL内部控件<br>27.1.1. MySQL线程<br>27.1.2. MySQL测试套件<br>27.2. 为MySQL添加新函数<br>27.2.1. 自定义函数接口的特性<br>27.2.2. CREATE FUNCTION/DROP FUNCTION语法<br>27.2.3. 添加新的自定义函数<br>27.2.4. 添加新的固有函数<br>27.3. 为MySQL添加新步骤<br>27.3.1. 步骤分析<br>27.3.2. 编写步骤<br>A. 问题和常见错误<br>A.1. 如何确定导致问题的原因<br>A.2. 使用MySQL程序时的常见错误<br>A.2.1. 拒绝访问<br>A.2.2. 无法连接到[local] MySQL服务器<br>A.2.3. 客户端不支持鉴定协议<br>A.2.4. 输入密码时出现密码错误<br>A.2.5. 主机的host_name被屏蔽<br>A.2.6. 连接数过多<br>A.2.7. 内存溢出<br>A.2.8. MySQL服务器不可用<br>A.2.9. 信息包过大<br>A.2.10. 通信错误和失效连接<br>A.2.11. 表已满<br>A.2.12. 无法创建文件/写入文件<br>A.2.13. 命令不同步<br>A.2.14. 忽略用户<br>A.2.15. 表tbl_name不存在<br>A.2.16. 无法初始化字符集<br>A.2.17. 文件未找到<br>A.3. 与安装有关的事宜<br>A.3.1. 与MySQL客户端库的链接问题<br>A.3.2. 如何以普通用户身份运行MySQL<br>A.3.3. 与文件许可有关的问题<br>A.4. 与管理有关的事宜<br>A.4.1. 如何复位根用户密码<br>A.4.2. 如果MySQL依然崩溃,应作些什么<br>A.4.3. MySQL处理磁盘满的方式<br>A.4.4. MySQL将临时文件储存在哪里<br>A.4.5. 如何保护或更改MySQL套接字文件/tmp/mysql.sock<br>A.4.6. 时区问题<br>A.5. 与查询有关的事宜<br>A.5.1. 搜索的大小写敏感性<br>A.5.2. 使用DATE列方面的问题<br>A.5.3. 与NULL值有关的问题<br>A.5.4. 与列别名有关的问题<br>A.5.5. 非事务表回滚失败<br>A.5.6. 从相关表删除行<br>A.5.7. 解决与不匹配行有关的问题<br>A.5.8. 与浮点比较有关的问题<br>A.6. 与优化器有关的事宜<br>A.7. 与表定义有关的事宜<br>A.7.1. 与ALTER TABLE有关的问题<br>A.7.2. 如何更改表的列顺序<br>A.7.3. TEMPORARY TABLE问题<br>A.8. MySQL的已知事宜<br>A.8.1. MySQL的打开事宜<br>B. 错误代码和消息<br>B.1. 服务器错误代码和消息<br>B.2. 客户端错误代码和消息<br>C. 感谢<br>C.1. MySQL AB处的开发人<br>C.2. MySQL贡献人<br>C.3. 资料员和译员<br>C.4. MySQL使用和包含的库<br>C.5. 支持MySQL的软件包<br>C.6. 用于创建MySQL的工具<br>C.7. MySQL支持人员<br>D. MySQL变更史<br>D.1. 5.1.x版的变更情况(开发)<br>D.1.1. 5.1.2版的变更情况(尚未发布)<br>D.1.2. 5.1.1版的变更情况(尚未发布)<br>D.2. MyODBC的变更情况<br>D.2.1. MyODBC 3.51.12的变更情况<br>D.2.2. MyODBC 3.51.11的变更情况<br>E. 移植到其他系统<br>E.1. 调试MySQL服务器<br>E.1.1. 针对调试编译MySQL<br>E.1.2. 创建跟踪文件<br>E.1.3. 在gdb环境下调试mysqld<br>E.1.4. 使用堆栈跟踪<br>E.1.5. 使用日志文件找出mysqld的错误原因<br>E.1.6. 如果出现表崩溃,请生成测试案例<br>E.2. 调试MySQL客户端<br>E.3. DBUG软件包<br>E.4. 关于RTS线程的注释<br>E.5. 线程软件包之间的差异<br>F. 环境变量<br>G. MySQL正则表达式<br>H. MySQL的限制<br>H.1. 联合的限制<br>I. 特性限制<br>I.1. 对存储子程序和触发程序的限制<br>I.2. 对服务器端光标的限制<br>I.3. 对子查询的限制<br>I.4. 对视图的限制<br>I.5. 对XA事务的限制<br>J. GNU通用公共许可<br>K. MySQL FLOSS许可例外<br>索引<br>图形清单<br><br>14.1. MySQL插件式存储引擎的体系结构<br>14.2. 存储引擎比较<br>16.1. MySQL体系结构<br>表格清单<br><br>26.1. 连接属性<br>26.2. 转换表<br>26.3. 用于ResultSet.getObject()的MySQL类型和Java类型<br>26.4. MySQL对Java编码名称的翻译<br>示例清单<br><br>26.1. 从DriverManager获得连接<br>26.2. 使用java.sql.Statement执行SELECT查询<br>26.3. 存储程序示例<br>26.4. 使用Connection.prepareCall()<br>26.5. 注册输出参数<br>26.6. 设置CallableStatement输入参数<br>26.7. 检索结果和输出参数值<br>26.8. 使用Statement.getGeneratedKeys()检索AUTO_INCREMENT列的值<br>26.9. 使用SELECT LAST_INSERT_ID()检索AUTO_INCREMENT列的值<br>26.10. 在可更新的ResultSets检索AUTO_INCREMENT列的值<br>26.11. 设置Unix环境下的CLASSPATH<br>26.12. 与J2EE应用服务器一起使用连接池<br>26.13. 重试逻辑的事务示例
MySQL 5.1参考手册 目录 前言 1. 一般信息 1.1. 关于本手册 1.2. 本手册采用的惯例 1.3. MySQL AB概述 1.4. MySQL数据库管理系统概述 1.4.1. MySQL的历史 1.4.2. MySQL的的主要特性 1.4.3. MySQL稳定性 1.4.4. MySQL表最大能达到多少 1.4.5. 2000年兼容性 1.5. MaxDB数据库管理系统概述 1.5.1. 什么是MaxDB? 1.5.2. MaxDB的历史 1.5.3. MaxDB的特性 1.5.4. 许可和支持 1.5.5. MaxDB和MySQL之间的特性差异 1.5.6. MaxDB和MySQL之间的协同性 1.5.7. 与MaxDB有关的链接 1.6. MySQL发展大事记 1.6.1. MySQL 5.1的新特性 1.7. MySQL信息源 1.7.1. MySQL邮件列表 1.7.2. IRC(在线聊天系统)上的MySQL社区支持 1.7.3. MySQL论坛上的MySQL社区支持 1.8. MySQL标准的兼容性 1.8.1. MySQL遵从的标准是什么 1.8.2. 选择SQL模式 1.8.3. 在ANSI模式下运行MySQL 1.8.4. MySQL对标准SQL的扩展 1.8.5. MySQL与标准SQL的差别 1.8.6. MySQL处理约束的方式 2. 安装MySQL 2.1. 一般安装问题 2.1.1. MySQL支持的操作系统 2.1.2. 选择要安装的MySQL分发版 2.1.3. 怎样获得MySQL 2.1.4. 通过MD5校验和或GnuPG验证软件包的完整性 2.1.5. 安装布局 2.2. 使用二进制分发版的标准MySQL安装 2.3. 在Windows上安装MySQL 2.3.1. Windows系统要求 2.3.2. 选择安装软件包 2.3.3. 用自动安装器安装MySQL 2.3.4. 使用MySQL安装向导 2.3.5. 使用配置向导 2.3.6. 通过非安装Zip文件安装MySQL 2.3.7. 提取安装档案文件 2.3.8. 创建选项文件 2.3.9. 选择MySQL服务器类型 2.3.10. 首次启动服务器 2.3.11. 从Windows命令行启动MySQL 2.3.12. 以Windows服务方式启动MySQL 2.3.13. 测试MySQL安装 2.3.14. 在Windows环境下对MySQL安装的故障诊断与排除 2.3.15. 在Windows下升级MySQL 2.3.16. Windows版MySQL同Unix版MySQL对比 2.4. 在Linux下安装MySQL 2.5.在Mac OS X安装MySQL 2.6. 在NetWare安装MySQL 2.7. 在其它类Unix系统安装MySQL 2.8. 使用源码分发版安装MySQL 2.8.1. 源码安装概述 2.8.2. 典型配置选项 2.8.3. 从开发源码树安装 2.8.4. 处理MySQL编译问题 2.8.5. MIT-pthreads注意事项 2.8.6. 在Windows下从源码安装MySQL 2.8.7. 在Windows下编译MySQL客户端 2.9. 安装后的设置和测试 2.9.1. Windows下安装后的过程 2.9.2. Unix下安装后的过程 2.9.3. 使初始MySQL账户安全 2.10. 升级MySQL 2.10.1. 从5.0版升级 2.10.2. 升级授权表 2.10.3. 将MySQL数据库拷贝到另一台机器 2.11. 降级MySQL 2.12. 具体操作系统相关的注意事项 2.12.1. Linux注意事项 2.12.2. Mac OS X注意事项 2.12.3. Solaris注意事项 2.12.4. BSD注意事项 2.12.5. 其它Unix注意事项 2.12.6. OS/2注意事项 2.13. Perl安装注意事项 2.13.1. 在Unix安装Perl 2.13.2. 在Windows下安装ActiveState Perl 2.13.3. 使用Perl DBI/DBD接口的问题 3. 教程 3.1. 连接与断开服务器 3.2. 输入查询 3.3. 创建并使用数据库 3.3.1. 创建并选择数据库 3.3.2. 创建表 3.3.3. 将数据装入表 3.3.4. 从表检索信息 3.4. 获得数据库和表的信息 3.5. 在批处理模式下使用mysql 3.6. 常用查询的例子 3.6.1. 列的最大值 3.6.2. 拥有某个列的最大值的行 3.6.3. 列的最大值:按组 3.6.4. 拥有某个字段的组间最大值的行 3.6.5. 使用用户变量 3.6.6. 使用外键 3.6.7. 根据两个键搜索 3.6.8. 根据天计算访问量 3.6.9. 使用AUTO_INCREMENT 3.7. 孪生项目的查询 3.7.1. 查找所有未分发的孪生项 3.7.2. 显示孪生对状态的表 3.8. 与Apache一起使用MySQL 4. MySQL程序概述 4.1. MySQL程序概述 4.2. 调用MySQL程序 4.3. 指定程序选项 4.3.1. 在命令行上使用选项 4.3.2. 使用选项文件 4.3.3. 用环境变量指定选项 4.3.4. 使用选项设置程序变量 5. 数据库管理 5.1. MySQL服务器和服务器启动脚本 5.1.1. 服务器端脚本和实用工具概述 5.1.2. mysqld-max扩展MySQL服务器 5.1.3. mysqld_safe:MySQL服务器启动脚本 5.1.4. mysql.server:MySQL服务器启动脚本 5.1.5. mysqld_multi:管理多个MySQL服务器的程序 5.2. mysqlmanager:MySQL实例管理器 5.2.1. 用MySQL实例管理器启动MySQL服务器 5.2.2. 连接到MySQL实例管理器并创建用户账户 5.2.3. MySQL实例管理器命令行选项 5.2.4. MySQL实例管理器配置文件 5.2.5. MySQL实例管理器识别的命令 5.3. mysqld:MySQL服务器 5.3.1. mysqld命令行选项 5.3.2. SQL服务器模式 5.3.3. 服务器系统变量 5.3.4. 服务器状态变量 5.4. mysql_fix_privilege_tables:升级MySQL系统表 5.5. MySQL服务器关机进程 5.6. 一般安全问题 5.6.1. 通用安全指南 5.6.2. 使MySQL在攻击者面前保持安全 5.6.3. Mysqld安全相关启动选项 5.6.4. LOAD DATA LOCAL安全问题 5.7. MySQL访问权限系统 5.7.1. 权限系统的作用 5.7.2. 权限系统工作原理 5.7.3. MySQL提供的权限 5.7.4. 与MySQL服务器连接 5.7.5. 访问控制, 阶段1:连接核实 5.7.6. 访问控制, 阶段2:请求核实 5.7.7. 权限更改何时生效 5.7.8. 拒绝访问错误的原因 5.7.9. MySQL 4.1的密码哈希处理 5.8. MySQL用户账户管理 5.8.1. MySQL用户名和密码 5.8.2. 向MySQL增加新用户账户 5.8.3. 从MySQL删除用户账户 5.8.4. 限制账户资源 5.8.5. 设置账户密码 5.8.6. 使你的密码安全 5.8.7. 使用安全连接 5.9. 备份与恢复 5.9.1. 数据库备份 5.9.2. 示例用备份与恢复策略 5.9.3. 自动恢复 5.9.4. 表维护和崩溃恢复 5.9.5. myisamchk:MyISAM表维护实用工具 5.9.6. 建立表维护计划 5.9.7. 获取关于表的信息 5.10. MySQL本地化和国际应用 5.10.1. 数据和排序用字符集 5.10.2. 设置错误消息语言 5.10.3. 添加新的字符集 5.10.4. 字符定义数组 5.10.5. 字符串比较支持 5.10.6. 多字节字符支持 5.10.7. 字符集问题 5.10.8. MySQL服务器时区支持 5.11. MySQL日志文件 5.11.1. 错误日志 5.11.2. 通用查询日志 5.11.3. 二进制日志 5.11.4. 慢速查询日志 5.11.5. 日志文件维护 5.12. 在同一台机器上运行多个MySQL服务器 5.12.1. 在Windows下运行多个服务器 5.12.2. 在Unix运行多个服务器 5.12.3. 在多服务器环境使用客户端程序 5.13. MySQL查询高速缓冲 5.13.1. 查询高速缓冲如何工作 5.13.2. 查询高速缓冲SELECT选项 5.13.3. 查询高速缓冲配置 5.13.4. 查询高速缓冲状态和维护 6. MySQL的复制 6.1. 复制介绍 6.2. 复制实施概述 6.3. 复制实施细节 6.3.1. 复制主线程状态 6.3.2. 复制从I/O线程状态 6.3.3. 复制从SQL线程状态 6.3.4. 复制传递和状态文件 6.4. 如何设置复制 6.5. 不同MySQL版本之间的复制兼容性 6.6. 升级复制设置 6.6.1. 将复制升级到5.0版 6.7. 复制特性和已知问题 6.8. 复制启动选项 6.9. 复制FAQ 6.10. 复制故障诊断与排除 6.11. 通报复制缺陷 6.12. 多服务器复制的Auto-Increment 7. 优化 7.1. 优化概述 7.1.1. MySQL设计局限与折衷 7.1.2. 为可移植性设计应用程序 7.1.3. 我们已将MySQL用在何处? 7.1.4. MySQL基准套件 7.1.5. 使用自己的基准 7.2. 优化SELECT语句和其它查询 7.2.1. EXPLAIN语法(获取SELECT相关信息) 7.2.2. 估计查询性能 7.2.3. SELECT查询的速度 7.2.4. MySQL怎样优化WHERE子句 7.2.5. 范围优化 7.2.6. 索引合并优化 7.2.7. MySQL如何优化IS NULL 7.2.8. MySQL如何优化DISTINCT 7.2.9. MySQL如何优化LEFT JOIN和RIGHT JOIN 7.2.10. MySQL如何优化嵌套Join 7.2.11. MySQL如何简化外部联合 7.2.12. MySQL如何优化ORDER BY 7.2.13. MySQL如何优化GROUP BY 7.2.14. MySQL如何优化LIMIT 7.2.15. 如何避免表扫描 7.2.16. INSERT语句的速度 7.2.17. UPDATE语句的速度 7.2.18. DELETE语句的速度 7.2.19. 其它优化技巧 7.3. 锁定事宜 7.3.1. 锁定方法 7.3.2. 表锁定事宜 7.4. 优化数据库结构 7.4.1. 设计选择 7.4.2. 使你的数据尽可能小 7.4.3. 列索引 7.4.4. 多列索引 7.4.5. MySQL如何使用索引 7.4.6. MyISAM键高速缓冲 7.4.7. MyISAM索引统计集合 7.4.8. MySQL如何计算打开的表 7.4.9. MySQL如何打开和关闭表 7.4.10. 在同一个数据库创建多个表的缺陷 7.5. 优化MySQL服务器 7.5.1. 系统因素和启动参数的调节 7.5.2. 调节服务器参数 7.5.3. 控制查询优化器的性能 7.5.4. 编译和链接怎样影响MySQL的速度 7.5.5. MySQL如何使用内存 7.5.6. MySQL如何使用DNS 7.6. 磁盘事宜 7.6.1. 使用符号链接 8. 客户端和实用工具程序 8.1. 客户端脚本和实用工具概述 8.2. myisampack:生成压缩、只读MyISAM表 8.3. mysql:MySQL命令行工具 8.3.1. 选项 8.3.2. mysql命令 8.3.3. 怎样从文本文件执行SQL语句 8.3.4. mysql技巧 8.4. mysqlaccess:用于检查访问权限的客户端 8.5. mysqladmin:用于管理MySQL服务器的客户端 8.6. mysqlbinlog:用于处理二进制日志文件的实用工具 8.7. mysqlcheck:表维护和维修程序 8.8. mysqldump:数据库备份程序 8.9. mysqlhotcopy:数据库备份程序 8.10. mysqlimport:数据导入程序 8.11. mysqlshow-显示数据库、表和列信息 8.12. myisamlog:显示MyISAM日志文件内容 8.13. perror:解释错误代码 8.14. replace:字符串替换实用工具 8.15. mysql_zap:杀死符合某一模式的进程 9. 语言结构 9.1. 文字值 9.1.1. 字符串 9.1.2. 数值 9.1.3. 十六进制值 9.1.4. 布尔值 9.1.5. 位字段值 9.1.6. NULL值 9.2. 数据库、表、索引、列和别名 9.2.1. 识别符限制条件 9.2.2. 识别符大小写敏感性 9.3. 用户变量 9.4. 系统变量 9.4.1. 结构式系统变量 9.5. 注释语法 9.6. MySQL保留字的处理 10. 字符集支持 10.1. 常规字符集和校对 10.2. MySQL的字符集和校对 10.3. 确定默认字符集和校对 10.3.1. 服务器字符集和校对 10.3.2. 数据库字符集和校对 10.3.3. 表字符集和校对 10.3.4. 列字符集和校对 10.3.5. 字符集和校对分配示例 10.3.6. 连接字符集和校对 10.3.7. 字符串文字字符集和校对 10.3.8. 在SQL语句使用COLLATE 10.3.9. COLLATE子句优先 10.3.10. BINARY操作符 10.3.11. 校对确定较为复杂的一些特殊情况 10.3.12. 校对必须适合字符集 10.3.13. 校对效果的示例 10.4. 字符集支持影响到的操作 10.4.1. 结果字符串 10.4.2. CONVERT() 10.4.3. CAST() 10.4.4. SHOW语句 10.5. Unicode支持 10.6. 用于元数据的UTF8 10.7. 与其它DBMS的兼容性 10.8. 新字符集配置文件格式 10.9. 国家特有字符集 10.10. MySQL支持的字符集和校对 10.10.1. Unicode字符集 10.10.2. 西欧字符集 10.10.3. 欧字符集 10.10.4. 南欧与东字符集 10.10.5. 波罗的海字符集 10.10.6. 西里尔字符集 10.10.7. 亚洲字符集 11. 列类型 11.1. 列类型概述 11.1.1. 数值类型概述 11.1.2. 日期和时间类型概述 11.1.3. 字符串类型概述 11.2. 数值类型 11.3. 日期和时间类型 11.3.1. DATETIME、DATE和TIMESTAMP类型 11.3.2. TIME类型 11.3.3. YEAR类型 11.3.4. Y2K事宜和日期类型 11.4. String类型 11.4.1. CHAR和VARCHAR类型 11.4.2. BINARY和VARBINARY类型 11.4.3. BLOB和TEXT类型 11.4.4. ENUM类型 11.4.5. SET类型 11.5. 列类型存储需求 11.6. 选择正确的列类型 11.7. 使用来自其他数据库引擎的列类型 12. 函数和操作符 12.1. 操作符 12.1.1. 操作符优先级 12.1.2. 圆括号 12.1.3. 比较函数和操作符 12.1.4. 逻辑操作符 12.2. 控制流程函数 12.3. 字符串函数 12.3.1. 字符串比较函数 12.4. 数值函数 12.4.1. 算术操作符 12.4.2. 数学函数 12.5. 日期和时间函数 12.6. MySQL使用什么日历? 12.7. 全文搜索功能 12.7.1. 布尔全文搜索 12.7.2. 全文搜索带查询扩展 12.7.3. 全文停止字 12.7.4. 全文限定条件 12.7.5. 微调MySQL全文搜索 12.8. Cast函数和操作符 12.9. 其他函数 12.9.1. 位函数 12.9.2. 加密函数 12.9.3. 信息函数 12.9.4. 其他函数 12.10. 与GROUP BY子句同时使用的函数和修改程序 12.10.1. GROUP BY(聚合)函数 12.10.2. GROUP BY修改程序 12.10.3. 具有隐含字段的GROUP BY 13. SQL语句语法 13.1. 数据定义语句 13.1.1. ALTER DATABASE语法 13.1.2. ALTER TABLE语法 13.1.3. CREATE DATABASE语法 13.1.4. CREATE INDEX语法 13.1.5. CREATE TABLE语法 13.1.6. DROP DATABASE语法 13.1.7. DROP INDEX语法 13.1.8. DROP TABLE语法 13.1.9. RENAME TABLE语法 13.2. 数据操作语句 13.2.1. DELETE语法 13.2.2. DO语法 13.2.3. HANDLER语法 13.2.4. INSERT语法 13.2.5. LOAD DATA INFILE语法 13.2.6. REPLACE语法 13.2.7. SELECT语法 13.2.8. Subquery语法 13.2.9. TRUNCATE语法 13.2.10. UPDATE语法 13.3. MySQL实用工具语句 13.3.1. DESCRIBE语法(获取有关列的信息) 13.3.2. USE语法 13.4. MySQL事务处理和锁定语句 13.4.1. START TRANSACTION, COMMIT和ROLLBACK语法 13.4.2. 不能回滚的语句 13.4.3. 会造成隐式提交的语句 13.4.4. SAVEPOINT和ROLLBACK TO SAVEPOINT语法 13.4.5. LOCK TABLES和UNLOCK TABLES语法 13.4.6. SET TRANSACTION语法 13.4.7. XA事务 13.5. 数据库管理语句 13.5.1. 账户管理语句 13.5.2. 表维护语句 13.5.3. SET语法 13.5.4. SHOW语法 13.5.5. 其它管理语句 13.6. 复制语句 13.6.1. 用于控制主服务器的SQL语句 13.6.2. 用于控制从服务器的SQL语句 13.7. 用于预处理语句的SQL语法 14. 插件式存储引擎体系结构 14.1. 前言 14.2. 概述 14.3. 公共MySQL数据库服务器层 14.4. 选择存储引擎 14.5. 将存储引擎指定给表 14.6. 存储引擎和事务 14.7. 插入存储引擎 14.8. 拔出存储引擎 14.9. 插件式存储器的安全含义 15. 存储引擎和表类型 15.1. MyISAM存储引擎 15.1.1. MyISAM启动选项 15.1.2. 键所需的空间 15.1.3. MyISAM表的存储格式 15.1.4. MyISAM表方面的问题 15.2. InnoDB存储引擎 15.2.1. InnoDB概述 15.2.2. InnoDB联系信息 15.2.3. InnoDB配置 15.2.4. InnoDB启动选项 15.2.5. 创建InnoDB表空间 15.2.6. 创建InnoDB表 15.2.7. 添加和删除InnoDB数据和日志文件 15.2.8. InnoDB数据库的备份和恢复 15.2.9. 将InnoDB数据库移到另一台机器上 15.2.10. InnoDB事务模型和锁定 15.2.11. InnoDB性能调节提示 15.2.12. 多版本的实施 15.2.13. 表和索引结构 15.2.14. 文件空间管理和磁盘I/O 15.2.15. InnoDB错误处理 15.2.16. 对InnoDB表的限制 15.2.17. InnoDB故障诊断与排除 15.3. MERGE存储引擎 15.3.1. MERGE表方面的问题 15.4. MEMORY (HEAP)存储引擎 15.5. BDB (BerkeleyDB)存储引擎 15.5.1. BDB支持的操作系统 15.5.2. 安装BDB 15.5.3. BDB启动选项 15.5.4. BDB表的特性 15.5.5. 修改BDB所需的事宜 15.5.6. 对BDB表的限制 15.5.7. 使用BDB表时可能出现的错误 15.6. EXAMPLE存储引擎 15.7. FEDERATED存储引擎 15.7.1. 安装FEDERATED存储引擎 15.7.2. FEDERATED存储引擎介绍 15.7.3. 如何使用FEDERATED表 15.7.4. FEDERATED存储引擎的局限性 15.8. ARCHIVE存储引擎 15.9. CSV存储引擎 15.10. BLACKHOLE存储引擎 16. 编写自定义存储引擎 16.1. 前言 16.2. 概述 16.3. 创建存储引擎源文件 16.4. 创建handlerton 16.5. 对处理程序进行实例化处理 16.6. 定义表扩展 16.7. 创建表 16.8. 打开表 16.9. 实施基本的表扫描功能 16.9.1. 实施store_lock()函数 16.9.2. 实施external_lock()函数 16.9.3. 实施rnd_init()函数 16.9.4. 实施info()函数 16.9.5. 实施extra()函数 16.9.6. 实施rnd_next()函数 16.10. 关闭表 16.11. 为存储引擎添加对INSERT的支持 16.12. 为存储引擎添加对UPDATE的支持 16.13. 为存储引擎添加对DELETE的支持 16.14. API引用 16.14.1. bas_ext 16.14.2. close 16.14.3. create 16.14.4. delete_row 16.14.5. delete_table 16.14.6. external_lock 16.14.7. extra 16.14.8. info 16.14.9. open 16.14.10. rnd_init 16.14.11. rnd_next 16.14.12. store_lock 16.14.13. update_row 16.14.14. write_row 17. MySQL簇 17.1. MySQL簇概述 17.2. MySQL簇的基本概念 17.3. 多计算机的简单基础知识 17.3.1. 硬件、软件和联网 17.3.2. 安装 17.3.3. 配置 17.3.4. 首次启动 17.3.5. 加载示例数据并执行查询 17.3.6. 安全关闭和重启 17.4. MySQL簇的配置 17.4.1. 从源码创建MySQL簇 17.4.2. 安装软件 17.4.3. MySQL簇的快速测试设置 17.4.4. 配置文件 17.5. MySQL簇的进程管理 17.5.1. 用于MySQL簇的MySQL服务器进程使用 17.5.2. ndbd,存储引擎节点进程 17.5.3. ndb_mgmd,“管理服务器”进程 17.5.4. ndb_mgm,“管理客户端”进程 17.5.5. 用于MySQL簇进程的命令选项 17.6. MySQL簇的管理 17.6.1. MySQL簇的启动阶段 17.6.2. “管理客户端”的命令 17.6.3. MySQL簇生成的事件报告 17.6.4. 单用户模式 17.6.5. MySQL簇的联机备份 17.7. 使用与MySQL簇的高速互连 17.7.1. 配置MySQL簇以使用SCI套接字 17.7.2. 理解簇互连的影响 17.8. MySQL簇的已知限制 17.9. MySQL簇发展的重要历程 17.9.1. MySQL 5.0的MySQL簇变化 17.9.2. 关于MySQL簇的MySQL 5.1发展历程 17.10. MySQL簇常见问题解答 17.11. MySQL簇术语表 18. 分区 18.1. MySQL的分区概述 18.2. 分区类型 18.2.1. RANGE分区 18.2.2. LIST分区 18.2.3. HASH分区 18.2.4. KEY分区 18.2.5. 子分区 18.2.6. MySQL分区处理NULL值的方式 18.3. 分区管理 18.3.1. RANGE和LIST分区的管理 18.3.2. HASH和KEY分区的管理 18.3.3. 分区维护 18.3.4. 获取关于分区的信息 19. MySQL的空间扩展 19.1. 前言 19.2. OpenGIS几何模型 19.2.1. Geometry类的层次 19.2.2. 类Geometry 19.2.3. 类Point 19.2.4. 类Curve 19.2.5. 类LineString 19.2.6. 类Surface 19.2.7. 类Polygon 19.2.8. 类GeometryCollection 19.2.9. 类MultiPoint 19.2.10. 类MultiCurve 19.2.11. 类MultiLineString 19.2.12. 类MultiSurface 19.2.13. 类MultiPolygon 19.3. 支持的空间数据格式 19.3.1. 著名的文本(WKT)格式 19.3.2. 著名的二进制(WKB)格式 19.4. 创建具备空间功能的MySQL数据库 19.4.1. MySQL空间数据类型 19.4.2. 创建空间值 19.4.3. 创建空间列 19.4.4. 填充空间列 19.4.5. 获取空间数据 19.5. 分析空间信息 19.5.1. Geometry格式转换函数 19.5.2. Geometry函数 19.5.3. 从已有Geometry创建新Geometry的函数 19.5.4. 测试几何对象间空间关系的函数 19.5.5. 关于几何最小边界矩形(MBR)的关系 19.5.6. 测试几何类之间空间关系的函数 19.6. 优化空间分析 19.6.1. 创建空间索引 19.6.2. 使用空间索引 19.7. MySQL的一致性和兼容性 19.7.1. 尚未实施的GIS特性 20. 存储程序和函数 20.1. 存储程序和授权表 20.2. 存储程序的语法 20.2.1. CREATE PROCEDURE和CREATE FUNCTION 20.2.2. ALTER PROCEDURE和ALTER FUNCTION 20.2.3. DROP PROCEDURE和DROP FUNCTION 20.2.4. SHOW CREATE PROCEDURE和SHOW CREATE FUNCTION 20.2.5. SHOW PROCEDURE STATUS和SHOW FUNCTION STATUS 20.2.6. CALL语句 20.2.7. BEGIN ... END复合语句 20.2.8. DECLARE语句 20.2.9. 存储程序的变量 20.2.10. 条件和处理程序 20.2.11. 光标 20.2.12. 流程控制构造 20.3. 存储程序、函数、触发程序和复制:常见问题 20.4. 存储子程序和触发程序的二进制日志功能 21. 触发程序 21.1. CREATE TRIGGER语法 21.2. DROP TRIGGER语法 21.3. 使用触发程序 22. 视图 22.1. ALTER VIEW语法 22.2. CREATE VIEW语法 22.3. DROP VIEW语法 22.4. SHOW CREATE VIEW语法 23. INFORMATION_SCHEMA信息数据库 23.1. INFORMATION_SCHEMA表 23.1.1. INFORMATION_SCHEMA SCHEMATA表 23.1.2. INFORMATION_SCHEMA TABLES表 23.1.3. INFORMATION_SCHEMA COLUMNS表 23.1.4. INFORMATION_SCHEMA STATISTICS表 23.1.5. INFORMATION_SCHEMA USER_PRIVILEGES表 23.1.6. INFORMATION_SCHEMA SCHEMA_PRIVILEGES表 23.1.7. INFORMATION_SCHEMA TABLE_PRIVILEGES表 23.1.8. INFORMATION_SCHEMA COLUMN_PRIVILEGES表 23.1.9. INFORMATION_SCHEMA CHARACTER_SETS表 23.1.10. INFORMATION_SCHEMA COLLATIONS表 23.1.11. INFORMATION_SCHEMA COLLATION_CHARACTER_SET_APPLICABILITY表 23.1.12. INFORMATION_SCHEMA TABLE_CONSTRAINTS表 23.1.13. INFORMATION_SCHEMA KEY_COLUMN_USAGE表 23.1.14. INFORMATION_SCHEMA ROUTINES表 23.1.15. INFORMATION_SCHEMA VIEWS表 23.1.16. INFORMATION_SCHEMA TRIGGERS表 23.1.17. 其他INFORMATION_SCHEMA表 23.2. SHOW语句的扩展 24. 精度数学 24.1. 数值的类型 24.2. DECIMAL数据类型更改 24.3. 表达式处理 24.4. 四舍五入 24.5. 精度数学示例 25. API和库 25.1. libmysqld,嵌入式MySQL服务器库 25.1.1. 嵌入式MySQL服务器库概述 25.1.2. 使用libmysqld编译程序 25.1.3. 使用嵌入式MySQL服务器时的限制 25.1.4. 与嵌入式服务器一起使用的选项 25.1.5. 嵌入式服务器尚需完成的事项(TODO) 25.1.6. 嵌入式服务器示例 25.1.7. 嵌入式服务器的许可 25.2. MySQL C API 25.2.1. C API数据类型 25.2.2. C API函数概述 25.2.3. C API函数描述 25.2.4. C API预处理语句 25.2.5. C API预处理语句的数据类型 25.2.6. C API预处理语句函数概述 25.2.7. C API预处理语句函数描述 25.2.8. C API预处理语句方面的问题 25.2.9. 多查询执行的C API处理 25.2.10. 日期和时间值的C API处理 25.2.11. C API线程函数介绍 25.2.12. C API嵌入式服务器函数介绍 25.2.13. 使用C API时的常见问题 25.2.14. 创建客户端程序 25.2.15. 如何生成线程式客户端 25.3. MySQL PHP API 25.3.1. 使用MySQL和PHP的常见问题 25.4. MySQL Perl API 25.5. MySQL C++ API 25.5.1. Borland C++ 25.6. MySQL Python API 25.7. MySQL Tcl API 25.8. MySQL Eiffel Wrapper 25.9. MySQL程序开发实用工具 25.9.1. msql2mysql:转换mSQL程序以用于MySQL 25.9.2. mysql_config:获取编译客户端的编译选项 26. 连接器 26.1. MySQL Connector/ODBC 26.1.1. MyODBC介绍 26.1.2. 关于ODBC和MyODBC的一般信息 26.1.3. 如何安装MyODBC 26.1.4. 在Windows平台上从二进制版本安装MyODBC 26.1.5. I在Unix平台上从二进制版本安装MyODBC 26.1.6. 在Windows平台上从源码版本安装MyODBC 26.1.7. 在Unix平台上从源码版本安装MyODBC 26.1.8. 从BitKeeper开发源码树安装MyODBC 26.1.9. MyODBC配置 26.1.10. 与MyODBC连接相关的事宜 26.1.11. MyODBC和Microsoft Access 26.1.12. MyODBC和Microsoft VBA及ASP 26.1.13. MyODBC和第三方ODBC工具 26.1.14. MyODBC通用功能 26.1.15. 基本的MyODBC应用步骤 26.1.16. MyODBC API引用 26.1.17. MyODBC数据类型 26.1.18. MyODBC错误代码 26.1.19. MyODBC与VB:ADO、DAO和RDO 26.1.20. MyODBC与Microsoft.NET 26.1.21. 感谢 26.2. MySQL Connector/NET 26.2.1. 前言 26.2.2. 下载并安装MySQL Connector/NET 26.2.3. Connector/NET体系结构 26.2.4. 使用MySQL Connector/NET 26.2.5. MySQL Connector/NET变更史 26.3. MySQL Connector/J 26.3.1. 基本的JDBC概念 26.3.2. 安装 Connector/J 26.3.3. JDBC引用 26.3.4. 与J2EE和其他Java框架一起使用 Connector/J 26.3.5. 诊断 Connector/J方面的问题 26.3.6. Changelog 26.4. MySQL Connector/MXJ 26.4.1. 前言 26.4.2. 支持平台: 26.4.3. Junit测试要求 26.4.4. 运行Junit测试 26.4.5. 作为JDBC驱动程序的一部分运行 26.4.6. 在Java对象运行 26.4.7. MysqldResource API 26.4.8. 在JMX代理(custom)运行 26.4.9. 部署在标准的JMX代理环境下 (JBoss) 26.4.10. 安装 27. 扩展MySQL 27.1. MySQL内部控件 27.1.1. MySQL线程 27.1.2. MySQL测试套件 27.2. 为MySQL添加新函数 27.2.1. 自定义函数接口的特性 27.2.2. CREATE FUNCTION/DROP FUNCTION语法 27.2.3. 添加新的自定义函数 27.2.4. 添加新的固有函数 27.3. 为MySQL添加新步骤 27.3.1. 步骤分析 27.3.2. 编写步骤 A. 问题和常见错误 A.1. 如何确定导致问题的原因 A.2. 使用MySQL程序时的常见错误 A.2.1. 拒绝访问 A.2.2. 无法连接到[local] MySQL服务器 A.2.3. 客户端不支持鉴定协议 A.2.4. 输入密码时出现密码错误 A.2.5. 主机的host_name被屏蔽 A.2.6. 连接数过多 A.2.7. 内存溢出 A.2.8. MySQL服务器不可用 A.2.9. 信息包过大 A.2.10. 通信错误和失效连接 A.2.11. 表已满 A.2.12. 无法创建文件/写入文件 A.2.13. 命令不同步 A.2.14. 忽略用户 A.2.15. 表tbl_name不存在 A.2.16. 无法初始化字符集 A.2.17. 文件未找到 A.3. 与安装有关的事宜 A.3.1. 与MySQL客户端库的链接问题 A.3.2. 如何以普通用户身份运行MySQL A.3.3. 与文件许可有关的问题 A.4. 与管理有关的事宜 A.4.1. 如何复位根用户密码 A.4.2. 如果MySQL依然崩溃,应作些什么 A.4.3. MySQL处理磁盘满的方式 A.4.4. MySQL将临时文件储存在哪里 A.4.5. 如何保护或更改MySQL套接字文件/tmp/mysql.sock A.4.6. 时区问题 A.5. 与查询有关的事宜 A.5.1. 搜索的大小写敏感性 A.5.2. 使用DATE列方面的问题 A.5.3. 与NULL值有关的问题 A.5.4. 与列别名有关的问题 A.5.5. 非事务表回滚失败 A.5.6. 从相关表删除行 A.5.7. 解决与不匹配行有关的问题 A.5.8. 与浮点比较有关的问题 A.6. 与优化器有关的事宜 A.7. 与表定义有关的事宜 A.7.1. 与ALTER TABLE有关的问题 A.7.2. 如何更改表的列顺序 A.7.3. TEMPORARY TABLE问题 A.8. MySQL的已知事宜 A.8.1. MySQL的打开事宜 B. 错误代码和消息 B.1. 服务器错误代码和消息 B.2. 客户端错误代码和消息 C. 感谢 C.1. MySQL AB处的开发人 C.2. MySQL贡献人 C.3. 资料员和译员 C.4. MySQL使用和包含的库 C.5. 支持MySQL的软件包 C.6. 用于创建MySQL的工具 C.7. MySQL支持人员 D. MySQL变更史 D.1. 5.1.x版的变更情况(开发) D.1.1. 5.1.2版的变更情况(尚未发布) D.1.2. 5.1.1版的变更情况(尚未发布) D.2. MyODBC的变更情况 D.2.1. MyODBC 3.51.12的变更情况 D.2.2. MyODBC 3.51.11的变更情况 E. 移植到其他系统 E.1. 调试MySQL服务器 E.1.1. 针对调试编译MySQL E.1.2. 创建跟踪文件 E.1.3. 在gdb环境下调试mysqld E.1.4. 使用堆栈跟踪 E.1.5. 使用日志文件找出mysqld的错误原因 E.1.6. 如果出现表崩溃,请生成测试案例 E.2. 调试MySQL客户端 E.3. DBUG软件包 E.4. 关于RTS线程的注释 E.5. 线程软件包之间的差异 F. 环境变量 G. MySQL正则表达式 H. MySQL的限制 H.1. 联合的限制 I. 特性限制 I.1. 对存储子程序和触发程序的限制 I.2. 对服务器端光标的限制 I.3. 对子查询的限制 I.4. 对视图的限制 I.5. 对XA事务的限制 J. GNU通用公共许可 K. MySQL FLOSS许可例外 索引 图形清单 14.1. MySQL插件式存储引擎的体系结构 14.2. 存储引擎比较 16.1. MySQL体系结构 表格清单 26.1. 连接属性 26.2. 转换表 26.3. 用于ResultSet.getObject()的MySQL类型和Java类型 26.4. MySQL对Java编码名称的翻译 示例清单 26.1. 从DriverManager获得连接 26.2. 使用java.sql.Statement执行SELECT查询 26.3. 存储程序示例 26.4. 使用Connection.prepareCall() 26.5. 注册输出参数 26.6. 设置CallableStatement输入参数 26.7. 检索结果和输出参数值 26.8. 使用Statement.getGeneratedKeys()检索AUTO_INCREMENT列的值 26.9. 使用SELECT LAST_INSERT_ID()检索AUTO_INCREMENT列的值 26.10. 在可更新的ResultSets检索AUTO_INCREMENT列的值 26.11. 设置Unix环境下的CLASSPATH 26.12. 与J2EE应用服务器一起使用连接池 26.13. 重试逻辑的事务示例

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值