09 协议解析 命令阶段

在命令阶段,客户端发送command packet,其sequence-id为[00]:

13 00 00 00 03 53 ...
01 00 00 00 01
            ^^- command-byte
         ^^---- sequence-id == 0

payload的第一个字节描述了命令类型,如下:

HexConstant Name
00COM_SLEEP
01COM_QUIT
02COM_INIT_DB
03COM_QUERY
04COM_FIELD_LIST
05COM_CREATE_DB
06COM_DROP_DB
07COM_REFRESH
08COM_SHUTDOWN
09COM_STATISTICS
0aCOM_PROCESS_INFO
0bCOM_CONNECT
0cCOM_PROCESS_KILL
0dCOM_DEBUG
0eCOM_PING
0fCOM_TIME
10COM_DELAYED_INSERT
11COM_CHANGE_USER
12COM_BINLOG_DUMP
13COM_TABLE_DUMP
14COM_CONNECT_OUT
15COM_REGISTER_SLAVE
16COM_STMT_PREPARE
17COM_STMT_EXECUTE
18COM_STMT_SEND_LONG_DATA
19COM_STMT_CLOSE
1aCOM_STMT_RESET
1bCOM_SET_OPTION
1cCOM_STMT_FETCH
1dCOM_DAEMON
1eCOM_BINLOG_DUMP_GTID
1fCOM_RESET_CONNECTION

这些command属于:

  • Text Protocol
  • Utility Commands
  • Prepared Statements
  • Stored Programs

Text Protocol

COM_QUERY

发送基于文本协议的SQL查询,执行立即开始。响应COM_QUERY Response

有效负载如下:

TypeNameDescription
int<1>command0x03: COM_QUERY
string<EOF>query要执行的SQL查询的文本

示例:

21 00 00 00 03 73 65 6c    65 63 74 20 40 40 76 65    !....select @@ve
72 73 69 6f 6e 5f 63 6f    6d 6d 65 6e 74 20 6c 69    rsion_comment li
6d 69 74 20 31                                        mit 1

COM_QUERY Response

查询响应数据包是一个元数据包,可以是以下之一:

  • ERR_Packet
  • OK_Packet
  • LOCAL INFILE Request
  • Text Resultset

image

注意:如果打开CLIENT_DEPRECATE_EOF,则发送OK_Packet而不是实际的EOF_Packet数据包。

Prepared Statements

COM_STMT_EXECUTE

COM_STMT_EXECUTE要求服务器执行由stmt_id标识的准备好的语句。

它以Binary Protocol Value形式发送准备好的语句的占位符的值(如果包含)。每个参数的类型由两个字节组成:

  • Protocol::ColumnType中的类型
  • 如果类型是无符号的,则标志字节的最高位被设置[80]

用于此数据包的num_params必须与相应的准备好的语句的COM_STMT_PREPARE_OKnum_params匹配。

响应COM_STMT_EXECUTE Response

COM_STMT_EXECUTE:

COM_STMT_EXECUTE
  execute a prepared statement

  direction: client -> server
  response: COM_STMT_EXECUTE Response

  payload:
    1              [17] COM_STMT_EXECUTE
    4              stmt-id
    1              flags
    4              iteration-count
      if num-params > 0:
    n              NULL-bitmap, length: (num-params+7)/8
    1              new-params-bound-flag
      if new-params-bound-flag == 1:
    n              type of each parameter, length: num-params * 2
    n              value of each parameter

  example:
    12 00 00 00 17 01 00 00    00 00 01 00 00 00 00 01    ................
    0f 00 03 66 6f 6f                                     ...foo

iteration-count总是为1。

flags如下:

FlagsConstant Name
0x00CURSOR_TYPE_NO_CURSOR
0x01CURSOR_TYPE_READ_ONLY
0x02CURSOR_TYPE_FOR_UPDATE
0x04CURSOR_TYPE_SCROLLABLE

null_bitmap就像Binary Protocol Resultset RowNULL-bitmap一样,只是它的bit_offset为0。

COM_STMT_EXECUTE Response

COM_QUERY响应类似,COM_STMT_EXECUTE返回以下之一:

  • OK_Packet
  • ERR_Packet
  • Binary Protocol Resultset
上次修改: 18 May 2020