01_mysql协议基础

1 基本类型

1.1 整数类型

1.1.1 固定长度整型

MySQL报文中整型值分别有1、2、3、4、6、8字节长度,使用小字节序传输。

1.1.2 长度编码整数类型

一个整数,消耗1,3,4或9个字节,具体取决于其数值

要将数字值转换为长度编码的整数:

如果值<251,则将其存储为1字节整数。

如果值为≥251且< 2^16,则存储为0xfc + 2字节整数。

如果值为≥2^16 和 <2^24, 0xfd + 3字节整数存储。

如果值为≥2^24 和 <2^64, 0xfe + 8字节整数存储。

要将长度编码的整数转换成其数值,请检查第一个字节:

如果是<0xfb,则将其视为1字节整数。

如果是0xfb,空数据,数据的真实长度为零。

如果是0xfc,则后跟2字节整数。

如果是0xfd,则后跟3个字节的整数。

如果为0xfe,则后跟8字节整数。

注意:
- 0xfe也可能是EOF_Packet
- 0xfb在ResultsetRow中表示NULL
- 0xff是ERR_Packet的第一个字节

1.2 字符串类型

1.2.1 固定长度字符串(FixedLengthString)

固定长度的字符串具有已知的硬编码长度。
一个例子是ERR_Packet的sql-state ,它总是5个字节长。

1.2.2 以NULL结尾(NulTerminatedString)

字符串长度不固定,当遇到’NULL’(0x00)字符时结束。

1.2.3 长度编码的字符串(LengthEncodedString)

长度编码的字符串是以长度编码整数为前缀描述字符串的长度的字符串。

1.2.4 VariableLengthString

字符串的长度由某个字段决定。

1.2.5 RestOfPacketString

如果字符串是数据包的最后一个组成部分,则可以从整个数据包长度减去当前位置计算其长度。

描述了数据包的字节序列:

类型描述
int<1>1 byte Protocol::FixedLengthInteger
int<2>2 byte Protocol::FixedLengthInteger
int<3>3 byte Protocol::FixedLengthInteger
int<4>4 byte Protocol::FixedLengthInteger
int<6>6 byte Protocol::FixedLengthInteger
int<8>8 byte Protocol::FixedLengthInteger
intProtocol::LengthEncodedInteger
stringProtocol::LengthEncodedString
stringProtocol::FixedLengthString
stringProtocol::VariableLengthString
stringProtocol::RestOfPacketString
stringProtocol::NulTerminatedString

2 数据包

类型名称描述
int <3>payload_length有效载荷的长度 分组中超过组成数据包头的最初4个字节的字节数
int <1>sequence_id序列号
stringpayload[len = payload_length ]分组的有效载荷

客户端和服务器之间的数据以最大16MB字节大小的数据包交换。

2.1 消息头

2.1.1 报文长度

用于标记当前请求消息的实际数据长度值,以字节为单位,占用3个字节,最大值为 0xFFFFFF,即接近 16 MB 大小(比16MB少1个字节)。
如果有效负载大于或等于2^24 -1字节,则长度设置为2^24 -1(0xffffff ),并且附加数据包与剩余的有效载荷一起发送,直到数据包的有效载荷小于2^24 -1字节。

2.1.2 序号

在一次完整的请求/响应交互过程中,用于保证消息顺序的正确,每次客户端发起请求时,序号值都会从0开始计算。

2.2 消息体

消息体用于存放请求的内容及响应的数据,长度由消息头中的长度值决定。

3 通用响应数据包

3.1 OK_Packet

一个OK数据包从服务器发送到客户端,表示成功的执行命令。 从MySQL 5.7.5开始,OK数据包也用于表示EOF,并且不推荐使用EOF数据包。

如果设置了CLIENT_PROTOCOL_41 ,则该数据包包含警告计数。

类型名称描述
int<1>header[00]或[fe] OK包头
intaffected_rows受影响的行
intlast_insert_id最后一个insert-id
if capabilities & CLIENT_PROTOCOL_41 {{
int<2>status_flags状态标志
int<2>warnings警告数量
} elseif capabilities & CLIENT_TRANSACTIONS {
int<2>status_flags状态标志
}
if capabilities & CLIENT_SESSION_TRACK {
stringinfo人类可读状态信息
if status_flags & SERVER_SESSION_STATE_CHANGED {
stringsession_state_changes会话状态信息
}
} else {
stringinfo人类可读状态信息
}

下面规则区分数据包是否表示OK或EOF:
- OK报文: header = 0,包长度> 7
- EOF报文: header = 0xfe,包长度 < 9

3.2 ERR_Packet

该数据包发出错误信号。 如果启用CLIENT_PROTOCOL_41 ,它将包含SQL状态值。

类型名称描述
int <1>header[ff] ERR数据包的头
int <2>error_code错误代码
if capabilities & CLIENT_PROTOCOL_41 {
string[1]sql_state_marker标记的SQL状态
string[5]sql_stateSQL状态
}
stringerror_message可读错误消息

3.3 EOF_Packet

如果启用CLIENT_PROTOCOL_41 ,则EOF数据包包含警告计数和状态标志。

类型名称描述
int <1>header[fe] EOF数据包的头
if capabilities & CLIENT_PROTOCOL_41 {
int <2>warnings警告数量
int <2>status_flags状态标志
}

EOF数据包可能会出现在可能出现Protocol::LengthEncodedInteger地方。 您必须检查数据包长度是否小于9,以确保它是EOF数据包。

3.4 Status Flags

FlagValueComment
SERVER_STATUS_IN_TRANS0x0001a transaction is active
SERVER_STATUS_AUTOCOMMIT0x0002auto-commit is enabled
SERVER_MORE_RESULTS_EXISTS0x0008
SERVER_STATUS_NO_GOOD_INDEX_USED0x0010
SERVER_STATUS_NO_INDEX_USED0x0020
SERVER_STATUS_CURSOR_EXISTS0x0040Used by Binary Protocol Resultset to signal that COM_STMT_FETCH must be used to fetch the row-data.
SERVER_STATUS_LAST_ROW_SENT0x0080
SERVER_STATUS_DB_DROPPED0x0100
SERVER_STATUS_NO_BACKSLASH_ESCAPES0x0200
SERVER_STATUS_METADATA_CHANGED0x0400
SERVER_QUERY_WAS_SLOW0x0800
SERVER_PS_OUT_PARAMS0x1000
SERVER_STATUS_IN_TRANS_READONLY0x2000in a read-only transaction
SERVER_SESSION_STATE_CHANGED0x4000connection state information has changed

4.字符集

MySQL具有非常灵活的字符集支持,如字符集支持中所述。 可以查询字符集及其ID的列表如下:

SELECT id,collation_name FROM information_schema.collations ORDER BY id;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值