執行命令訊息
發送完認證請求之后,服務端回傳 OK Response ,然后就可以發送執行命令訊息了;報文結構為

例如

其中前四位屬于訊息頭,包含訊息體的長度和訊息id,訊息體部分包括 命令id和執行引數,這里命令id=3表示該命令是 SQL查詢請求,后面跟著的是具體執行命令 “select * from users”,命令id代表的含義如下:
| 型別值 | 命令 | 功能 | 關聯函式 |
|---|---|---|---|
| 0x00 | COM_SLEEP | (內部執行緒狀態) | (無) |
| 0x01 | COM_QUIT | 關閉連接 | mysql_close |
| 0x02 | COM_INIT_DB | 切換資料庫 | mysql_select_db |
| 0x03 | COM_QUERY | SQL查詢請求 | mysql_real_query |
| 0x04 | COM_FIELD_LIST | 獲取資料表欄位資訊 | mysql_list_fields |
| 0x05 | COM_CREATE_DB | 創建資料庫 | mysql_create_db |
| 0x06 | COM_DROP_DB | 洗掉資料庫 | mysql_drop_db |
| 0x07 | COM_REFRESH | 清除快取 | mysql_refresh |
| 0x08 | COM_SHUTDOWN | 停止服務器 | mysql_shutdown |
| 0x09 | COM_STATISTICS | 獲取服務器統計資訊 | mysql_stat |
| 0x0A | COM_PROCESS_INFO | 獲取當前連接的串列 | mysql_list_processes |
| 0x0B | COM_CONNECT | (內部執行緒狀態) | (無) |
| 0x0C | COM_PROCESS_KILL | 中斷某個連接 | mysql_kill |
| 0x0D | COM_DEBUG | 保存服務器除錯資訊 | mysql_dump_debug_info |
| 0x0E | COM_PING | 測驗連通性 | mysql_ping |
| 0x0F | COM_TIME | (內部執行緒狀態) | (無) |
| 0x10 | COM_DELAYED_INSERT | (內部執行緒狀態) | (無) |
| 0x11 | COM_CHANGE_USER | 重新登陸(不斷連接) | mysql_change_user |
| 0x12 | COM_BINLOG_DUMP | 獲取二進制日志資訊 | (無) |
| 0x13 | COM_TABLE_DUMP | 獲取資料表結構資訊 | (無) |
| 0x14 | COM_CONNECT_OUT | (內部執行緒狀態) | (無) |
| 0x15 | COM_REGISTER_SLAVE | 從服務器向主服務器進行注冊 | (無) |
| 0x16 | COM_STMT_PREPARE | 預處理SQL陳述句 | mysql_stmt_prepare |
| 0x17 | COM_STMT_EXECUTE | 執行預處理陳述句 | mysql_stmt_execute |
| 0x18 | COM_STMT_SEND_LONG_DATA | 發送BLOB型別的資料 | mysql_stmt_send_long_data |
| 0x19 | COM_STMT_CLOSE | 銷毀預處理陳述句 | mysql_stmt_close |
| 0x1A | COM_STMT_RESET | 清除預處理陳述句引數快取 | mysql_stmt_reset |
| 0x1B | COM_SET_OPTION | 設定陳述句選項 | mysql_set_server_option |
| 0x1C | COM_STMT_FETCH | 獲取預處理陳述句的執行結果 | mysql_stmt_fetch |
當客戶端發送查詢請求后,在沒有錯誤的情況下,服務器會回傳結果集(Result Set)給客戶端,
Result Set 訊息分為五部分,結構如下:
| 結構 | 說明 |
|---|---|
| [Result Set Header] | 列數量 |
| [Field] | 列資訊(多個) |
| [EOF] | 列結束 |
| [Row Data] | 行資料(多個) |
| [EOF] | 資料結束 |
Result Set Header 結構
| 位元組 | 說明 |
|---|---|
| 1-9 | Field結構計數(Length Coded Binary) |
| 1-9 | 額外資訊(Length Coded Binary) |
示例:

Result Set Field 結構
| 位元組 | 說明 |
|---|---|
| n | 目錄名稱(Length Coded String) |
| n | 資料庫名稱(Length Coded String) |
| n | 資料表名稱(Length Coded String) |
| n | 資料表原始名稱(Length Coded String) |
| n | 列(欄位)名稱(Length Coded String) |
| 4 | 列(欄位)原始名稱(Length Coded String) |
| 1 | 填充值 |
| 2 | 字符編碼 |
| 4 | 列(欄位)長度 |
| 1 | 列(欄位)型別 |
| 2 | 列(欄位)標志 |
| 1 | 整型值精度 |
| 2 | 填充值(0x00) |
| n | 默認值(Length Coded String) |
示例:

Result Row Data 結構:
| 位元組 | 說明 |
|---|---|
| n | 欄位值(Length Coded String) |
| ... | (一行資料中包含多個欄位值) |
示例:

header結構體和field結構體報文中由于每個引數的欄位都含有固定的位數,所以獲取資料的時候只要按照固定位數截取資料就可以獲取到回應引數數值,但是 row data 結構體的資料并沒有固定的位數所以獲取方式與上面兩種不同,其應該先獲取訊息體重的首位位元組資料并將其轉為整數,該位元組后面的長度資料即為實際資料值,例如:
01 31 04 6c 69 73 61
應該分成兩部分 01 31 和 04 6c 69 73 61 分別表示 “1” 和 “lisa” 兩個字符
代碼分享地址
https://github.com/gphper/PHPMysql
參考檔案:
https://dev.mysql.com/doc/internals/en/client-server-protocol.html
https://www.cnblogs.com/davygeek/p/5647175.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/29094.html
標籤:PHP
