您好,登錄后才能下訂單哦!
本篇文章給大家分享的是有關(guān)mysql 報(bào)文的格式和基本類型的示例分析,小編覺得挺實(shí)用的,因此分享給大家學(xué)習(xí),希望大家閱讀完這篇文章后可以有所收獲,話不多說,跟著小編一起來看看吧。
navicat 和 mysql 是一對(duì)好基友,每天都有非常頻繁的交流,主人在navicat上寫下每條sql語句,輕輕的點(diǎn)了下執(zhí)行按鈕,navicat就飛快的把主人的指令傳送到mysql那里,mysql立馬把返回結(jié)果傳回navicat那里顯示給主人看。主人對(duì)他們的效率很滿意,同時(shí)主人也有點(diǎn)好奇:你們兩個(gè)基友是怎么通訊的呢?如果不通過navicat,我用程序直接和mysql交互該怎么做呢?
mysql 笑道:這是我們之間的秘密。。。
navicat有點(diǎn)不開心了:難道主人想拋棄我嗎?嗚嗚嗚。。。
主人安慰道:你想多了,我只是想更了解你們呀。
那我就給你詳細(xì)講講我們之間的小秘密吧,mysql悠悠的說道:
想要通過我的交互,就得照我規(guī)定的格式來,不能每個(gè)人過來都講自己的方言,我可聽不懂,來到我的地盤就得按我的規(guī)矩來。
1.我給你發(fā)的報(bào)文都是這種格式的:
服務(wù)器--->客戶端的報(bào)文格式
前面3個(gè)字節(jié)payload_length表示后面數(shù)據(jù)的實(shí)際長度,中間一個(gè)字節(jié)sequence_id表示報(bào)文的序號(hào),從0開始,每次加1,最后的paylaod就是我發(fā)你的內(nèi)容啦。
你可能也發(fā)現(xiàn)了,payload_length用3個(gè)字節(jié)表示,最大只能表示 224?1 bytes也是16M,如果報(bào)文大于或者等于16M那就要拆成2個(gè)報(bào)文了哦,
比如剛好發(fā)送16M的報(bào)文:
ff ff ff 00 (數(shù)據(jù)域16M)... 00 00 00 01 (數(shù)據(jù)域?yàn)榭眨?/pre>第二個(gè)報(bào)文的數(shù)據(jù)域是空的。
2.客戶端發(fā)給我的報(bào)文也是要按照一定格式的哦:
客戶端--->服務(wù)器的報(bào)文格式
第一個(gè)字節(jié)表示命令的類型
后面的字節(jié)表示具體的命令,例如關(guān)閉連接的報(bào)文是長這樣子滴:
這樣規(guī)定好后,我們就有共同語言啦,就能聽得懂對(duì)方在講什么了,所以說有共同語言是很重要滴。
主人細(xì)細(xì)的回味了下mysql剛才說的話,發(fā)現(xiàn)還有個(gè)地方?jīng)]弄明白問道:你發(fā)給我的報(bào)文中int<3>,string<var>表示什么意思呀?
mysql忽然意識(shí)到還忘了說一件重要的事情:哎呦,我忘了和你說基本的數(shù)據(jù)類型了。
mysql有2種基本的數(shù)據(jù)類型:
Integers(整數(shù)型) 和 String(字符串)
Integers(整數(shù)型)分為定長的整數(shù)類型(Fixed-length integers)和變長的整數(shù)類型(Length-encoded integers)
1.定長的整數(shù)類型(Fixed-length integers)分別能表示1,2,3,4,6,8字節(jié)的長度:
int<1>表示占1個(gè)字節(jié)的長度, int<2>表示占2個(gè)字節(jié)的長度,以此類推,比如 int<3> 表示1是這么表示的:01 00 00
對(duì)了,mysql協(xié)議中字節(jié)是按小頭(LittileEndian)的方式表示的,低位的字節(jié)在前面,總體占3個(gè)字節(jié),所以第一個(gè)字節(jié)是01,后面是00 00
2.變長的整數(shù)類型(Length-encoded integers)
如果數(shù)字 < 251, 就用一個(gè)字節(jié)表示 = 1個(gè)字節(jié)
如果數(shù)字 ≥ 251 并且 < (216),就用 fc
+ 2個(gè)字節(jié)表示 = 3個(gè)字節(jié)
如果數(shù)字 ≥ (216) 并且 < (224),就用 fd
+ 3個(gè)字節(jié)表示 = 4個(gè)字節(jié)
如果數(shù)字 ≥ (224) 并且 < (264) ,就用 fe
+ 8個(gè)字節(jié)表示 = 9個(gè)字節(jié)
主人表示很奇怪:一個(gè)字節(jié)最多能表示255個(gè)數(shù),為什么不能直接表示到255?而是只表示到250?
mysql微微一笑道:因?yàn)?51,252,253,254,255已經(jīng)被我征用了哦,它們表示特殊的用途:
251(fb):表示 NULL
252(fc):表示數(shù)值的大小占后面的2個(gè)字節(jié)
253(fd):表示數(shù)值的大小占后面的3個(gè)字節(jié)
254(fe):表示數(shù)值的大小占后面的8個(gè)字節(jié)
255(ff): 表示一個(gè)錯(cuò)誤報(bào)文 ERR packet
下面說說String(字符串)類型:
1.變長的字符類型(LengthEncodedString):和上面變長整數(shù)類型是一樣的,根據(jù)第一個(gè)字節(jié)的值判斷所占字節(jié)的長度
2.定長的字符串類型(FixedLengthString):后面的數(shù)字表示字符串所占字節(jié)的長度
3.動(dòng)態(tài)的計(jì)算長度(VariableLengthString):根據(jù)var動(dòng)態(tài)的計(jì)算長度
4.包末端字符串方式(RestOfPacketString):沒搞懂
5.空結(jié)尾的字符串類型(NulTerminatedString):字符串遇到 00 結(jié)束
原來如此,主人豁然開朗,看著navicat 和 mysql都親切了許多,知道他們之間是怎么通話之后,一個(gè)邪惡的想法慢慢從心底升起,嘿嘿,那我不就可以監(jiān)聽他們之間的對(duì)話了嘛,哈哈哈哈哈哈哈哈。。。
以上就是mysql 報(bào)文的格式和基本類型的示例分析,小編相信有部分知識(shí)點(diǎn)可能是我們?nèi)粘9ぷ鲿?huì)見到或用到的。希望你能通過這篇文章學(xué)到更多知識(shí)。更多詳情敬請(qǐng)關(guān)注億速云行業(yè)資訊頻道。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。