官网地址:Protocol Basics
对于客户端发送给服务器的大多数命令,服务器会返回其中一个数据包作为响应:
OK_Packet
一个OK数据包从服务器发送到客户端,表示命令成功完成。
从MySQL 5.7.5开始,OK包也用于指示EOF,且EOF包被弃用。
如果设置了CLIENT_PROTOCOL_41,则数据包包含警告计数。
这些规则区分数据包是代表OK还是EOF:
- OK: header = 0 and length of packet > 7
-
EOF: header = 0xfe and length of packet < 9
为确保旧版本(5.7.5之前版本)与新版本(5.7.5版本以上)之间的向后兼容性,新客户端发布了CLIENT_DEPRECATE_EOF标志:- 老客户不知道这个标志。 因此,服务器不会发送代表EOF的OK数据包。 (旧服务器从来不会这样做,新服务器认识到没有标志意味着它们不应该这样做。)
- 新客户传递此标志。 旧服务器不知道此标志,也不发送代表EOF的OK数据包。 新服务器识别该标志并可发送表示EOF的OK数据包。
举个例子:
通过CLIENT_PROTOCOL_41确定。 0受影响的行,last-insert-id为0,启用AUTOCOMMIT,0警告。 没有更多信息。
07 00 00 02 00 00 00 02 00 00 00
回话状态信息
状态改变信息在OK数据包中作为状态改变块的数组发送,它由以下部分组成:
屏幕快照 2018-04-14 上午11.57.02.png
数据字段的解释取决于类型值:
-
SESSION_TRACK_SYSTEM_VARIABLES
屏幕快照 2018-04-14 上午11.59.42.png
举个例子:
当设置 autocommit = OFF 状态时:
屏幕快照 2018-04-14 下午12.00.11.png -
SESSION_TRACK_SCHEMA
屏幕快照 2018-04-14 下午12.00.54.png
举个例子:
当 USE test 状态后:
use test.png -
SESSION_TRACK_STATE_CHANGE
标志字节,指示是否发生会话状态更改。 该标志表示为ASCII值。
屏幕快照 2018-04-14 下午12.05.02.png
举个例子:
在SET SESSION session_track_state_change = 1语句后:
屏幕快照 2018-04-14 下午12.07.46.png
ERR_Packet
该数据包表示发生了错误
如果启用了CLIENT_PROTOCOL_41,它将包含一个SQL状态值。
错误文本不能超过MYSQL_ERRMSG_SIZE.
屏幕快照 2018-04-14 下午12.11.46.png
举个例子:
屏幕快照 2018-04-14 下午12.12.31.png
EOF_Packet
如果启用CLIENT_PROTOCOL_41,则EOF数据包将包含警告计数和状态标志。
在MySQL客户端/服务器协议中,EOF_Packet和OK_Packet包服务于相同的目的,以标记查询执行结果的结束。 由于OK_Packet数据包中MySQL 5.7的变化(如会话状态跟踪),并为了避免重复EOF_Packet数据包中的更改,OK_Packet从MySQL 5.7.5开始已弃用。
EOF_Packet数据包可能出现在Protocol :: LengthEncodedInteger可能出现的地方。 您必须检查数据包长度是否小于9以确保它是EOF_Packet数据包。
EOF
举个例子:
一个MySQL 4.1 EOF包,包含:0个警告,启用AUTOCOMMIT。
屏幕快照 2018-04-14 下午12.18.22.png
Character Set 字符集
MySQL具有非常灵活的字符集支持,如字符集支持中所述。
字符集列表和它们的ID可以查询如下:
SELECT id, collation_name FROM information_schema.collations ORDER BY id;
屏幕快照 2018-04-14 下午12.22.28.png
下表显示了一些常用字符集。
屏幕快照 2018-04-14 下午12.25.10.png
-
Protocol::CharacterSet
协议中的字符集被定义为整数:- charset_nr (2) 字符集编号和排序规则
网友评论