美文网首页我爱编程
[翻译]mysql通信协议(4)-Protocol Basics

[翻译]mysql通信协议(4)-Protocol Basics

作者: 一滴水的坚持 | 来源:发表于2018-04-14 12:29 被阅读0次

    官网地址:Protocol Basics


    对于客户端发送给服务器的大多数命令,服务器会返回其中一个数据包作为响应:


    OK_Packet

    一个OK数据包从服务器发送到客户端,表示命令成功完成。
    从MySQL 5.7.5开始,OK包也用于指示EOF,且EOF包被弃用。
    如果设置了CLIENT_PROTOCOL_41,则数据包包含警告计数。

    ok.png
    这些规则区分数据包是代表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) 字符集编号和排序规则

    相关文章

      网友评论

        本文标题:[翻译]mysql通信协议(4)-Protocol Basics

        本文链接:https://www.haomeiwen.com/subject/ljzkkftx.html