MySQL几种NET包

客户端发送的包

1.客户端认证包

客户端认证函数:mysql_real_connect();(libmysql/libmysql.c)

服务器端认证函数:check_connections();(sql/sql_connect.c)

2.命令包

包括一字节的命令类型和其他命令参数

命令类型定义在文件include/mysql_com.h中,如下所示:

enum enum_server_command
{
  COM_SLEEP, COM_QUIT, COM_INIT_DB, COM_QUERY, COM_FIELD_LIST,
  COM_CREATE_DB, COM_DROP_DB, COM_REFRESH, COM_SHUTDOWN, COM_STATISTICS,
  COM_PROCESS_INFO, COM_CONNECT, COM_PROCESS_KILL, COM_DEBUG, COM_PING,
  COM_TIME, COM_DELAYED_INSERT, COM_CHANGE_USER, COM_BINLOG_DUMP,
  COM_TABLE_DUMP, COM_CONNECT_OUT, COM_REGISTER_SLAVE,
  COM_STMT_PREPARE, COM_STMT_EXECUTE, COM_STMT_SEND_LONG_DATA, COM_STMT_CLOSE,
  COM_STMT_RESET, COM_SET_OPTION, COM_STMT_FETCH, COM_DAEMON,
  /* don't forget to update const char *command_name[] in sql_parse.cc */ 

  /* Must be last */
  COM_END
};

在libmysql.c中定义了对命令执行的函数,如mysql_rollback、mysql_change_user、mysql_commit等

服务器端发送的包

1.握手初始化包,回应用户连接请求

返回的信息包括线程号,协议版本,服务器端能接受的连接选项(include/mysql_com.h中,以CLIENT开头)、服务器字符集、服务状态标志(SERVER_STATUE_)

2.OK包,用于无需返回大结果集时对客户端命令的回应

如:COM_PING、COM_QUERY、COM_REFRESH、COM_REGISTER_SLAVE等

包括:

影响的行数、插入ID(如果操作引起了任何AUTO_INCREMENT作用)、消息(诸如:2 rows in set (0.00 sec))

发送OK包函数:net_send_ok();(sql/protocol.cc)

3.error包,用于处理错误反馈,如执行语句错误

在include/mysqld_error.h中定义了错误号

错误号对于错误状态(include/sql_state.h)

发送error包函数 net_send_error_packet();(sql/protocol.cc)

4.结果集包

查询结果如果有n列,m行,则会发送m+n+3个包,包括包头、列包、行包、EOF包

结果集组成:包头 | n个列包 | EOF包 | m个行包 | EOF包

客户端处理结果集函数:mysql_use_result();(libmysql/libmysql.c)

1)列包:用于描述每一列

列支持的数据类型用宏定义(include/mysql_com.h)

列包发送函数:服务器端send_fields();(sql/sql_base.cc),客户端cli_list_fields()

2)行包

每行一个数据包

3)EOF包

用于标识某种类型的包已经传送结束

函数:write_eof_packet()、send_eof();

你可能感兴趣的:(mysql)