mysql 數(shù)據(jù)類型
Integer
mysql的整型有兩種
-
固定長(zhǎng)度
- int<1>
- int<2>
- int<3>
- int<4>
- int<6>
- int<8>
假如要用一個(gè)3字節(jié)int<3>的表示1,那么他的十六進(jìn)制數(shù)是
01 00 00
假如要用一個(gè)3字節(jié)int<3>的表示256呢?
-
可變長(zhǎng)度int<lenenc>
- 如果值是< 251钥勋,用一個(gè)字節(jié)存
- 如果值是 >=251 and < 2^16蕊肥,會(huì)存儲(chǔ)是三個(gè)字節(jié)勾习,第一個(gè)字節(jié)是fc開頭轧坎,然后緊接的2個(gè)字節(jié)表示實(shí)際大小股耽,例如fc fb 01 蹄咖,開頭是fc褐健,然后實(shí)際值是fb 01,這兩個(gè)字節(jié)從十六進(jìn)制轉(zhuǎn)為十進(jìn)制是511
- 如果值是 >=2^16 and < 2^24次方澜汤,會(huì)存儲(chǔ)為4個(gè)字節(jié)蚜迅,第一個(gè)字節(jié)是fd,后面接3個(gè)字節(jié)
- 如果值是 >= 2^24 and 2 ^64次方银亲,會(huì)存儲(chǔ)為9個(gè)字節(jié)慢叨,第一個(gè)字節(jié)是fe,后面接8個(gè)字節(jié)
所以可變長(zhǎng)度可能是會(huì)消耗1,3,4或者9個(gè)字節(jié)
字符串類型
- FixedLengthString string<fix>
這種是用固定字節(jié)的來(lái)保存字符串 - NulTerminatedString string<NUL>
這種字符串會(huì)以00進(jìn)行結(jié)束 - VariableLengthString string<var>
- LengthEncodedString string<lenenc>
這種比較特殊务蝠,它的第一部分是用可變長(zhǎng)整型表示拍谐,然后第二部分接一個(gè)以改整型表示的固定長(zhǎng)度字符串表示即
int<lenenc> + string<fix> - RestOfPacketString string<EOF>
這種字符串一般是出現(xiàn)在報(bào)文的最后面,然后它的長(zhǎng)度時(shí)候根據(jù)報(bào)文長(zhǎng)度和當(dāng)前解析位置計(jì)算出來(lái)的
所有的數(shù)據(jù)類型如官網(wǎng)的下圖
mysql官網(wǎng)的報(bào)文是如何表示的
我們首先要清楚以上的數(shù)據(jù)類型,因?yàn)镸ysql官方協(xié)議文檔就是用以上的類型去表達(dá)不同的報(bào)文轩拨。一般地践瓷,官網(wǎng)會(huì)首先定義payLoad部分,然后提供一個(gè)例子(包括報(bào)文頭)來(lái)展示每個(gè)發(fā)送出去的報(bào)文亡蓉。
如果報(bào)文例子里面用到了固定的值晕翠,例如某種報(bào)文頭的某個(gè)字節(jié)是一模一樣的,那么這個(gè)值會(huì)以中括號(hào)括起來(lái)砍濒,例如[00]
mysql報(bào)文傳輸是怎么樣的淋肾?
mysql協(xié)議把要發(fā)送的數(shù)據(jù) 分割成小于等于16MB-1字節(jié)的字節(jié)流(后面簡(jiǎn)稱payLoad),然后加上一個(gè)頭部作為一個(gè)協(xié)議包進(jìn)行發(fā)送爸邢,即
協(xié)議包: [報(bào)文頭] + 小于等于16MB-1字節(jié)的數(shù)據(jù)
其中報(bào)文頭的大小是4個(gè)字節(jié)樊卓,前三個(gè)字節(jié)表示的是固定長(zhǎng)度整型int<3>,表示的是協(xié)議包(payLoad)的長(zhǎng)度杠河,第4個(gè)字節(jié)是int<1>碌尔,表示的是序列號(hào),官網(wǎng)的介紹如下
例如下面通過(guò)wireShark截取一個(gè)報(bào)文如下
疑問(wèn)
- int<3>的類型如果是 [ab cd ef ]券敌,他表示的是十進(jìn)制的哪個(gè)值呢唾戚?
- 2^32值是4294 967 296即4GB,F(xiàn)F FF FF的值是16 777 215 即16MB待诅,也就是說(shuō)Mysql的一個(gè)數(shù)據(jù)包可以用一個(gè)完整的Buffer保存