雙線服務(wù)器響應(yīng)的不同類型
一旦雙線服務(wù)器收到命令,會(huì)執(zhí)行命令,然后發(fā)送一個(gè)或多個(gè)響應(yīng)包。本篇將討論幾種不同類型的響應(yīng)。
數(shù)據(jù)域
數(shù)據(jù)域是許多雙線服務(wù)器響應(yīng)包的重要組件。一個(gè)數(shù)據(jù)域包括一個(gè)長(zhǎng)度指定符序列,后面是實(shí)際的數(shù)據(jù)值。通過(guò)研究sql/pack.c中的net_store_length()定義可以理解長(zhǎng)度指定符序列:
正如你所看到的,如果length數(shù)值不超過(guò)251,那么代碼將它保存在1個(gè)字節(jié)中。如果是251字節(jié)以上但裝在兩個(gè)字節(jié)中,則代碼為其加上252這個(gè)數(shù)值前綴,然后將其寫(xiě)到接下來(lái)的兩個(gè)字節(jié)中。如果兩個(gè)字節(jié)不夠而4個(gè)字節(jié)夠用,則代碼使用253作為代碼,然后以長(zhǎng)度占用后面的字節(jié)。如果4個(gè)字節(jié)不夠,則代碼使用254作為代碼,然后存儲(chǔ)在8個(gè)字節(jié)中。必須注意,代碼后面的所有長(zhǎng)度值都低字節(jié)優(yōu)先存儲(chǔ)。
有人可能會(huì)問(wèn),為什么把1字節(jié)長(zhǎng)度限制為251,而net_store_length()中的個(gè)保留值卻是252?代碼251具有特殊的含義,它表明代碼后面沒(méi)有長(zhǎng)度數(shù)值或數(shù)據(jù),且該域的數(shù)值為SQL NULL。
為什么要這么復(fù)雜呢?大多數(shù)時(shí)候數(shù)據(jù)域都相當(dāng)短,尤其是,如果一個(gè)查詢返回大量記錄或選擇了大量列,那么,響應(yīng)中將有大量這些內(nèi)容。在這種情況下,每個(gè)域只要浪費(fèi)1個(gè)字節(jié),會(huì)積少成多形成龐大的系統(tǒng)開(kāi)銷。域長(zhǎng)度超過(guò)250的機(jī)會(huì)相對(duì)較少,但即使是在這種情況下,浪費(fèi)1字節(jié)也不會(huì)引入注意——因?yàn)?a >雙線服務(wù)器至少已經(jīng)在發(fā)送253個(gè)字節(jié):長(zhǎng)度至少占用2字節(jié),域值至少占用251字節(jié)。
緊跟在長(zhǎng)度序列后面的是實(shí)際數(shù)據(jù)值,該值被轉(zhuǎn)換為字符串表達(dá)式。
OK包
發(fā)送OK包則表示雙線服務(wù)器成功執(zhí)行了命令。發(fā)送OK包是對(duì)下列命令的響應(yīng):
這一類型的包括用于不要求返回結(jié)構(gòu)集的命令。然而它的格式卻允許發(fā)送一些額外的狀態(tài)信息,如修改記錄的數(shù)目、自動(dòng)生成的主鍵數(shù)值、或者字符串格式的狀態(tài)消息。包體的結(jié)構(gòu)收錄在表4-8中。
為了從雙線服務(wù)器內(nèi)部發(fā)送OK包,你必須調(diào)用send_ok()。
錯(cuò)誤包
在處理命令時(shí)如果發(fā)生錯(cuò)誤,雙線服務(wù)器會(huì)以錯(cuò)誤包進(jìn)行響應(yīng)。格式收錄在表4-9中。
對(duì)狀態(tài)字節(jié)區(qū)采用7字節(jié)限制的原因是,包體起始處的十進(jìn)制254字節(jié)可以具有不同的含義:可以使用本篇前文的“數(shù)據(jù)域”中描述的域長(zhǎng)度格式來(lái)指定結(jié)構(gòu)集中的域的數(shù)目。
為了發(fā)送一個(gè)EOF包,雙線服務(wù)器會(huì)使用send_eof()。
結(jié)果集包
大量查詢產(chǎn)生一個(gè)結(jié)果集,具體例子有SELECT、SHOW、CHECK、REPAIR、EXPLAIN。只要所期望的來(lái)自查詢的信息多于簡(jiǎn)單的狀態(tài)報(bào)告,會(huì)返回結(jié)果集。結(jié)果集包含一系列包。
.包體包括標(biāo)準(zhǔn)長(zhǎng)度指定符序列的包,不過(guò)目前的數(shù)值含義不一樣,它指的是結(jié)果集中的域的數(shù)目。
.一組域描述符包,每個(gè)域一個(gè)包,采用結(jié)果集中的域順序。
.EOF結(jié)束包
域描述包的包體格式如表4-11和4-12所示。
在發(fā)送各個(gè)包的域定義序列之后,雙線服務(wù)器接著發(fā)送數(shù)據(jù)的實(shí)際行,每行一個(gè)包。每行數(shù)據(jù)包包含一系列以標(biāo)準(zhǔn)域數(shù)據(jù)格式存儲(chǔ)的數(shù)值。在報(bào)告常規(guī)查詢結(jié)果時(shí),域數(shù)據(jù)會(huì)轉(zhuǎn)換為字符串格式。在使用預(yù)處理語(yǔ)句(COM_PREPARE)時(shí),域數(shù)據(jù)以本來(lái)格式發(fā)送,低字節(jié)優(yōu)先。
在發(fā)送出所有的數(shù)據(jù)行后,以EOF包終止包序列。
網(wǎng)站欄目:雙線服務(wù)器響應(yīng)的不同類型
轉(zhuǎn)載來(lái)源:http://m.rwnh.cn/news24/105374.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供響應(yīng)式網(wǎng)站、軟件開(kāi)發(fā)、微信小程序、靜態(tài)網(wǎng)站、Google、網(wǎng)站營(yíng)銷
廣告
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源:
創(chuàng)新互聯(lián)