双线服务器响应的不同类型
一旦双线服务器收到命令,会执行命令,然后发送一个或多个响应包。本篇将讨论几种不同类型的响应。
数据域
数据域是许多双线服务器响应包的重要组件。一个数据域包括一个长度指定符序列,后面是实际的数据值。通过研究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包终止包序列。
网站栏目:双线服务器响应的不同类型
转载来源:https://www.cdcxhl.com/news24/105374.html
成都网站建设公司_创新互联,为您提供响应式网站、软件开发、微信小程序、静态网站、Google、网站营销
广告
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源:
创新互联