双线服务器响应的不同类型
一旦双线服务器收到命令,会执行命令,然后发送一个或多个响应包。本篇将讨论几种不同类型的响应。
数据域
数据域是许多双线服务器响应包的重要组件。一个数据域包括一个长度指定符序列,后面是实际的数据值。通过研究sql/pack.c中的net_store_length()定义可以理解长度指定符序列:
正如你所看到的,如果length数值不超过251,那么代码将它保存在1个字节中。如果是251字节以上但装在两个字节中,则代码为其加上252这个数值前缀,然后将其写到接下来的两个字节中。如果两个字节不够而4个字节够用,则代码使用253作为代码,然后以长度占用后面的字节。如果4个字节不够,则代码使用254作为代码,然后存储在8个字节中。必须注意,代码后面的所有长度值都低字节优先存储。
有人可能会问,为什么把1字节长度限制为251,而net_store_length()中的个保留值却是252?代码251具有特殊的含义,它表明代码后面没有长度数值或数据,且该域的数值为sql null。
为什么要这么复杂呢?大多数时候数据域都相当短,尤其是,如果一个查询返回大量记录或选择了大量列,那么,响应中将有大量这些内容。在这种情况下,每个域只要浪费1个字节,会积少成多形成庞大的系统开销。域长度超过250的机会相对较少,但即使是在这种情况下,浪费1字节也不会引入注意——因为双线服务器至少已经在发送253个字节:长度至少占用2字节,域值至少占用251字节。
紧跟在长度序列后面的是实际数据值,该值被转换为字符串表达式。
ok包
发送ok包则表示双线服务器成功执行了命令。发送ok包是对下列命令的响应:
这一类型的包括用于不要求返回结构集的命令。然而它的格式却允许发送一些额外的状态信息,如修改记录的数目、自动生成的主键数值、或者字符串格式的状态消息。包体的结构收录在表4-8中。
为了从双线服务器内部发送ok包,你必须调用send_ok()。
错误包
在处理命令时如果发生错误,双线服务器会以错误包进行响应。格式收录在表4-9中。
对状态字节区采用7字节限制的原因是,包体起始处的十进制254字节可以具有不同的含义:可以使用本篇前文的“数据域”中描述的域长度格式来指定结构集中的域的数目。
为了发送一个eof包,双线服务器会使用send_eof()。
结果集包
大量查询产生一个结果集,具体例子有select、show、check、repair、explain。只要所期望的来自查询的信息多于简单的状态报告,会返回结果集。结果集包含一系列包。
.包体包括标准长度指定符序列的包,不过目前的数值含义不一样,它指的是结果集中的域的数目。
.一组域描述符包,每个域一个包,采用结果集中的域顺序。
.eof结束包
域描述包的包体格式如表4-11和4-12所示。
在发送各个包的域定义序列之后,双线服务器接着发送数据的实际行,每行一个包。每行数据包包含一系列以标准域数据格式存储的数值。在报告常规查询结果时,域数据会转换为字符串格式。在使用预处理语句(com_prepare)时,域数据以本来格式发送,低字节优先。
在发送出所有的数据行后,以eof包终止包序列。
网站运营的核心:SEO和用户体验内容更新和安全维护是公司网站建设的有机组成部分如何更让云服务器的使用更安全稳定?唐山建网站:制作网站该如何选择适合自己的功能?浅谈游戏官网现状及设计趋势全网营销常见的误区有哪些?手机网站建设有什么样的好处制作网站时该如何权衡流量和转化率?