Linux C/C++下抓包分析mysql流量(协议解析)

MySQL通信协议是一个有状态的协议,主要用于MySQL客户端与服务器之间的通信。这个协议在MySQL客户端连接器(如Connector/C、Connector/J等)、MySQL Proxy以及主从复制中都有实现。

该协议的特性包括:支持SSL、压缩和认证等功能。

MySQL客户端和服务端的交互过程主要分为两个阶段:握手认证阶段和命令执行阶段。
在握手认证阶段,服务端会生成一些服务信息,包括协议号、server版本、线程id、加密随机数(seeds)和服务端能力flag等信息。客户端则会生成认证信息,包含客户端能力flag、用户名、加密密码和连接数据库名字等信息。然后,服务端返回认证结果,如果验证正确,则返回OK包,否则是异常包。

此外,MySQL通信协议还支持多种进程间通信方式,例如管道、命名管道、共享内存、TCP/IP套接字和UNIX域套接字等。在实际应用中,可以使用诸如Wireshark的工具来抓取并分析MySQL协议。

mysql协议握手过程

MySQL协议的握手过程包括客户端和服务器之间的交互流程。下面是该过程的概述:

  1. 客户端向服务器发送连接请求。

  2. 服务器接收到连接请求后,返回一个握手数据包给客户端。

  3. 客户端收到握手数据包后,解析其中的信息,包括服务器版本、连接状态等。

  4. 客户端根据握手数据包中的信息,确定需要使用的协议版本,并发送一个握手响应数据包给服务器。

  5. 服务器接收到握手响应数据包后,验证客户端的身份和权限,并回复一个认证结果给客户端。

  6. 客户端接收到认证结果后,根据结果进行相应的处理,如关闭连接或进入下一步骤。

  7. 如果认证成功,客户端和服务器之间开始正常的通信,可以进行后续的查询、插入等数据库操作。

  8. 客户端将查询结果返回给服务器,服务器接收到结果并返回给客户端。

  9. 断开连接请求

    MySQL开启SSL加密协议的交互流程

  1. 服务器配置SSL:首先,MySQL服务器需要配置SSL证书和密钥。服务器会生成自己的SSL证书,并将证书和密钥配置到MySQL服务器的配置文件中。

  2. 客户端请求加密连接:客户端连接MySQL服务器时,需要在连接字符串中指定使用SSL协议。例如,可以在连接命令中添加--ssl参数,或者在连接配置文件中设置ssl-mode为"required"。

  3. 服务器握手协商:当服务器接收到客户端的连接请求并请求使用SSL协议时,服务器会回复一个握手数据包,其中包含服务器的SSL证书和其他SSL参数。

  4. 客户端验证证书:客户端收到服务器的握手数据包后,会验证服务器的SSL证书。客户端会检查证书是否合法且由受信任的发行机构签署。如果证书有效,则继续连接。

  5. 服务器验证客户端证书:如果服务器需要验证客户端的SSL证书,服务器会要求客户端提供SSL证书,并对证书进行验证。如果验证成功,则继续连接。

  6. SSL连接建立:在验证过程完成后,双方开始使用SSL协议进行通信,所有的数据传输都会被加密。

通过以上的握手和验证过程,MySQL客户端和服务器建立了一个安全的加密连接,确保数据在传输过程中的机密性和完整性。

mysql客户端/服务器功能

#define MYSQL_CAPS_LP 0x0001 /* CLIENT_LONG_PASSWORD */
#define MYSQL_CAPS_FR 0x0002 /* CLIENT_FOUND_ROWS */
#define MYSQL_CAPS_LF 0x0004 /* CLIENT_LONG_FLAG */
#define MYSQL_CAPS_CD 0x0008 /* CLIENT_CONNECT_WITH_DB */
#define MYSQL_CAPS_NS 0x0010 /* CLIENT_NO_SCHEMA */
#define MYSQL_CAPS_CP 0x0020 /* CLIENT_COMPRESS */
#define MYSQL_CAPS_OB 0x0040 /* CLIENT_ODBC */
#define MYSQL_CAPS_LI 0x0080 /* CLIENT_LOCAL_FILES */
#define MYSQL_CAPS_IS 0x0100 /* CLIENT_IGNORE_SPACE */
#define MYSQL_CAPS_CU 0x0200 /* CLIENT_PROTOCOL_41 */
#define MYSQL_CAPS_IA 0x0400 /* CLIENT_INTERACTIVE */
#define MYSQL_CAPS_SL 0x0800 /* CLIENT_SSL */
#define MYSQL_CAPS_II 0x1000 /* CLIENT_IGNORE_SPACE */
#define MYSQL_CAPS_TA 0x2000 /* CLIENT_TRANSACTIONS */
#define MYSQL_CAPS_RS 0x4000 /* CLIENT_RESERVED */
#define MYSQL_CAPS_SC 0x8000 /* CLIENT_SECURE_CONNECTION */

mysql客户端和服务器之间的通信怎么实现?协议特征有哪些?

MySQL客户端和服务器之间的通信是通过TCP/IP协议实现的。以下是MySQL协议的一些特征:

  1. 基于请求-响应模型:通信过程中,客户端发送请求到服务器,服务器进行处理后返回响应给客户端。

  2. 二进制协议:MySQL协议使用二进制格式进行传输,每个数据报文都包含了特定的字段结构以及相应的数据类型。

  3. 数据报文格式:数据报文由固定长度的报头和可变长度的有效载荷(payload)组成。报头包含了协议版本、连接ID、数据长度等信息。

  4. 多线程支持:MySQL协议支持多个线程在同一个连接上并发执行多个查询。服务器会为每个线程分配一个线程ID。

  5. 长连接:MySQL协议支持长连接,即客户端和服务器之间的连接可以保持开放状态,减少了连接和断开连接的开销。

  6. SQL语句支持:MySQL协议可以发送SQL语句(如查询语句、事务语句等)到服务器执行,并接收服务器返回的结果集。

  7. 错误处理:MySQL协议支持服务器返回错误信息,包括错误代码和错误描述,以便客户端处理异常情况。

  8. 安全连接:MySQL协议支持通过SSL/TLS进行通信加密,保护会话数据的安全性。

mysql服务器状态(位字段)

#define MYSQL_STAT_IT 0x0001
#define MYSQL_STAT_AC 0x0002
#define MYSQL_STAT_MR 0x0004
#define MYSQL_STAT_MU 0x0008
#define MYSQL_STAT_BI 0x0010
#define MYSQL_STAT_NI 0x0020
#define MYSQL_STAT_CR 0x0040
#define MYSQL_STAT_LR 0x0080
#define MYSQL_STAT_DR 0x0100
#define MYSQL_STAT_BS 0x0200
#define MYSQL_STAT_SESSION_STATE_CHANGED 0x0400
#define MYSQL_STAT_QUERY_WAS_SLOW 0x0800
#define MYSQL_STAT_PS_OUT_PARAMS 0x1000

MySQL命令代码

#define MYSQL_SLEEP 0 /* not from client */
#define MYSQL_QUIT 1
#define MYSQL_INIT_DB 2
#define MYSQL_QUERY 3
#define MYSQL_FIELD_LIST 4
#define MYSQL_CREATE_DB 5
#define MYSQL_DROP_DB 6
#define MYSQL_REFRESH 7
#define MYSQL_SHUTDOWN 8
#define MYSQL_STATISTICS 9
#define MYSQL_PROCESS_INFO 10
#define MYSQL_CONNECT 11 /* not from client */
#define MYSQL_PROCESS_KILL 12
#define MYSQL_DEBUG 13
#define MYSQL_PING 14
#define MYSQL_TIME 15         /* not from client */
#define MYSQL_DELAY_INSERT 16 /* not from client */
#define MYSQL_CHANGE_USER 17
#define MYSQL_BINLOG_DUMP 18    /* replication */
#define MYSQL_TABLE_DUMP 19     /* replication */
#define MYSQL_CONNECT_OUT 20    /* replication */
#define MYSQL_REGISTER_SLAVE 21 /* replication */
#define MYSQL_STMT_PREPARE 22
#define MYSQL_STMT_EXECUTE 23
#define MYSQL_STMT_SEND_LONG_DATA 24
#define MYSQL_STMT_CLOSE 25
#define MYSQL_STMT_RESET 26
#define MYSQL_SET_OPTION 27
#define MYSQL_STMT_FETCH 28

MySQL提供了多个命令用于执行数据库操作。下面列举了一些常用的MySQL命令及其作用:

  1. USE <database_name>:切换到指定的数据库。

  2. SHOW DATABASES:列出所有可用的数据库。

  3. SHOW TABLES:列出当前数据库中的所有表。

  4. SHOW COLUMNS FROM <table_name>:列出指定表的所有字段。

  5. SELECT <column_names> FROM <table_name> WHERE <condition>:从指定表中查询符合条件的数据。

  6. INSERT INTO <table_name> (<column_names>) VALUES (<values>):向指定表中插入新的行。

  7. UPDATE <table_name> SET <column_name>=<new_value> WHERE <condition>:更新指定表中符合条件的行。

  8. DELETE FROM <table_name> WHERE <condition>:从指定表中删除符合条件的行。

  9. ALTER TABLE <table_name> ADD COLUMN <column_definition>:向指定表中添加新的列。

  10. CREATE TABLE <table_name> (<column_definitions>):创建一个新的表。

  11. DROP TABLE <table_name>:删除指定的表。

  12. GRANT <privileges> ON <table_name> TO <user_name>@<host_name>:授予用户对指定表的权限。

  13. REVOKE <privileges> ON <table_name> FROM <user_name>@<host_name>:从用户中撤销对指定表的权限。

  14. DESCRIBE <table_name>EXPLAIN <table_name>:显示指定表的详细结构信息。

以上只是一些常见的MySQL命令,还有更多的命令可以用于执行复杂的数据库操作,如合并、分组、排序、连接等。MySQL命令的具体作用取决于使用的上下文和参数。

mysql数据报文类型分析

static const struct val_str mysql_state_table[] = {{UNDEFINED, "undefined"},{LOGIN, "login"},{REQUEST, "request"},{RESPONSE_OK, "response OK"},{RESPONSE_MESSAGE, "response message"},{RESPONSE_TABULAR, "tabular response"},{RESPONSE_SHOW_FIELDS, "response to SHOW FIELDS"},{FIELD_PACKET, "field packet"},{ROW_PACKET, "row packet"},{RESPONSE_PREPARE, "response to PREPARE"},{PREPARED_PARAMETERS, "parameters in response to PREPARE"},{PREPARED_FIELDS, "fields in response to PREPARE"},{AUTH_SWITCH_REQUEST, "authentication switch request"},{AUTH_SWITCH_RESPONSE, "authentication switch response"},{0, NULL}};

MySQL协议数据报文类型主要有以下几种:

  • 连接请求报文(Handshake Packet)

连接请求报文用于建立客户端与服务器之间的连接。其字段含义如下:
Protocol Version(协议版本):表示客户端和服务器之间使用的MySQL协议版本,例如5.7.21表示使用MySQL 5.7.21版本的协议。
Server Version(服务器版本):表示服务器的MySQL版本信息。
Connection ID(连接ID):表示客户端与服务器之间的连接标识符。
Salt(盐值):用于加密连接密码的随机字符串。
Session Capabilities(会话能力):表示客户端支持的会话特性,如事务、多语句执行等。
Charset(字符集):表示客户端与服务器之间通信所使用的字符编码方式。
Client Capabilities(客户端能力):表示客户端支持的特性,如支持的SQL语法、插件等。

  • 查询请求报文(Query Packet)

查询请求报文用于向服务器发送SQL查询语句。其字段含义如下:
Command Type(命令类型):表示查询请求的类型,值为0x03表示普通查询请求。
Status Code(状态码):表示服务器处理请求的结果,0表示成功,其他值表示错误。
Protocol Version(协议版本):表示客户端和服务器之间使用的MySQL协议版本。
Message(消息):表示服务器返回的关于请求处理结果的详细信息,通常包含错误信息或警告信息。
Fields Present(字段存在标志):表示数据包中实际存在的字段数量。
Column Count(列数):表示响应结果中的列的数量。
Row Data(行数据):包含查询结果的每一行数据。

  • 关闭连接报文(Terminate Packet)

关闭连接报文用于终止客户端与服务器之间的连接。其字段含义如下:
Status Code(状态码):表示服务器处理请求的结果,0表示成功,其他值表示错误。
Reason(原因):表示关闭连接的原因,如正常关闭、超时等。
Protocol Version(协议版本):表示客户端和服务器之间使用的MySQL协议版本。

MySQL的基本数据类型

MySQL的基本数据类型包括:

  • 1.数值数据类型:

整数类型:包括TINYINT、SMALLINT、MEDIUMINT、INT、BIGINT,这些类型占用字节数(存储空间)从小到大。
浮点小数数据类型:包括FLOAT和DOUBLE。
定点小数类型:用DECIMAL(M,N)表示,其中M表示精度、总共的位数;N表示标度、小数的位数。

  • 2.日期和时间数据类型:

YEAR
DATE
TIME
DATETIME
TIMESTAMP

  • 3.字符串数据类型:

CHAR:定长字符串,最大长度为255个字符。
VARCHAR:可变长字符串,最大长度为65535个字符。
TINYTEXT:非常小的文本字符串,最大长度为255个字符。
TEXT:小型文本字符串,最大长度为65535个字符。
BINARY:二进制字符串,最大长度为65535个字符。
VARBINARY:可变长二进制字符串,最大长度为65535个字符。

  • 4.二进制数据类型:

BINARY、VARBINARY、BIT、TINYBLOB、BLOB、MEDIUMBLOB、LONGBLOB。

这些基本类型为MySQL提供了丰富的数据表达方式。在使用MySQL时,可以根据需要选择合适的数据类型来存储数据。

Linux C/C++下抓包分析mysql流量(协议解析)

...
#define MYSQL_CAPS_LP 0x0001 /* CLIENT_LONG_PASSWORD */
#define MYSQL_CAPS_FR 0x0002 /* CLIENT_FOUND_ROWS */
#define MYSQL_CAPS_LF 0x0004 /* CLIENT_LONG_FLAG */
#define MYSQL_CAPS_CD 0x0008 /* CLIENT_CONNECT_WITH_DB */
#define MYSQL_CAPS_NS 0x0010 /* CLIENT_NO_SCHEMA */
#define MYSQL_CAPS_CP 0x0020 /* CLIENT_COMPRESS */
#define MYSQL_CAPS_OB 0x0040 /* CLIENT_ODBC */
#define MYSQL_CAPS_LI 0x0080 /* CLIENT_LOCAL_FILES */
#define MYSQL_CAPS_IS 0x0100 /* CLIENT_IGNORE_SPACE */
#define MYSQL_CAPS_CU 0x0200 /* CLIENT_PROTOCOL_41 */
#define MYSQL_CAPS_IA 0x0400 /* CLIENT_INTERACTIVE */
#define MYSQL_CAPS_SL 0x0800 /* CLIENT_SSL */
#define MYSQL_CAPS_II 0x1000 /* CLIENT_IGNORE_SPACE */
#define MYSQL_CAPS_TA 0x2000 /* CLIENT_TRANSACTIONS */
#define MYSQL_CAPS_RS 0x4000 /* CLIENT_RESERVED */
#define MYSQL_CAPS_SC 0x8000 /* CLIENT_SECURE_CONNECTION *//* field flags */
#define MYSQL_FLD_NOT_NULL_FLAG 0x0001
#define MYSQL_FLD_PRI_KEY_FLAG 0x0002
#define MYSQL_FLD_UNIQUE_KEY_FLAG 0x0004
#define MYSQL_FLD_MULTIPLE_KEY_FLAG 0x0008
#define MYSQL_FLD_BLOB_FLAG 0x0010
#define MYSQL_FLD_UNSIGNED_FLAG 0x0020
#define MYSQL_FLD_ZEROFILL_FLAG 0x0040
#define MYSQL_FLD_BINARY_FLAG 0x0080
#define MYSQL_FLD_ENUM_FLAG 0x0100
#define MYSQL_FLD_AUTO_INCREMENT_FLAG 0x0200
#define MYSQL_FLD_TIMESTAMP_FLAG 0x0400
#define MYSQL_FLD_SET_FLAG 0x0800
...
#define MYSQL_CAPS_MS 0x0001 /* CLIENT_MULTI_STATMENTS */
#define MYSQL_CAPS_MR 0x0002 /* CLIENT_MULTI_RESULTS */
#define MYSQL_CAPS_PM 0x0004 /* CLIENT_PS_MULTI_RESULTS */
#define MYSQL_CAPS_PA 0x0008 /* CLIENT_PLUGIN_AUTH */
#define MYSQL_CAPS_CA 0x0010 /* CLIENT_CONNECT_ATTRS */
#define MYSQL_CAPS_AL 0x0020 /* CLIENT_PLUGIN_AUTH_LENENC_CLIENT_DATA */
#define MYSQL_CAPS_EP 0x0040 /* CLIENT_CAN_HANDLE_EXPIRED_PASSWORDS */
#define MYSQL_CAPS_ST 0x0080 /* CLIENT_SESSION_TRACK */
#define MYSQL_CAPS_DE 0x0100 /* CLIENT_DEPRECATE_EOF */
#define MYSQL_CAPS_UNUSED 0xFE00/* status bitfield */
#define MYSQL_STAT_IT 0x0001
#define MYSQL_STAT_AC 0x0002
#define MYSQL_STAT_MR 0x0004
#define MYSQL_STAT_MU 0x0008
#define MYSQL_STAT_BI 0x0010
#define MYSQL_STAT_NI 0x0020
#define MYSQL_STAT_CR 0x0040
#define MYSQL_STAT_LR 0x0080
#define MYSQL_STAT_DR 0x0100
#define MYSQL_STAT_BS 0x0200
#define MYSQL_STAT_SESSION_STATE_CHANGED 0x0400
#define MYSQL_STAT_QUERY_WAS_SLOW 0x0800
#define MYSQL_STAT_PS_OUT_PARAMS 0x1000/* bitfield for MYSQL_REFRESH */
#define MYSQL_RFSH_GRANT 1    /* Refresh grant tables */
#define MYSQL_RFSH_LOG 2      /* Start on new log file */
#define MYSQL_RFSH_TABLES 4   /* close all tables */
#define MYSQL_RFSH_HOSTS 8    /* Flush host cache */
#define MYSQL_RFSH_STATUS 16  /* Flush status variables */
#define MYSQL_RFSH_THREADS 32 /* Flush thread cache */
#define MYSQL_RFSH_SLAVE 64   /* Reset master info and restart slave thread */
#define MYSQL_RFSH_MASTER 128 /* Remove all bin logs in the index and truncate the index *//* MySQL command codes */
#define MYSQL_SLEEP 0 /* not from client */
#define MYSQL_QUIT 1
#define MYSQL_INIT_DB 2
#define MYSQL_QUERY 3
#define MYSQL_FIELD_LIST 4
#define MYSQL_CREATE_DB 5
#define MYSQL_DROP_DB 6
#define MYSQL_REFRESH 7
#define MYSQL_SHUTDOWN 8
#define MYSQL_STATISTICS 9
#define MYSQL_PROCESS_INFO 10
#define MYSQL_CONNECT 11 /* not from client */
#define MYSQL_PROCESS_KILL 12
#define MYSQL_DEBUG 13
#define MYSQL_PING 14
#define MYSQL_TIME 15         /* not from client */
#define MYSQL_DELAY_INSERT 16 /* not from client */
#define MYSQL_CHANGE_USER 17
#define MYSQL_BINLOG_DUMP 18    /* replication */
#define MYSQL_TABLE_DUMP 19     /* replication */
#define MYSQL_CONNECT_OUT 20    /* replication */
#define MYSQL_REGISTER_SLAVE 21 /* replication */
#define MYSQL_STMT_PREPARE 22
#define MYSQL_STMT_EXECUTE 23
#define MYSQL_STMT_SEND_LONG_DATA 24
#define MYSQL_STMT_CLOSE 25
#define MYSQL_STMT_RESET 26
#define MYSQL_SET_OPTION 27
#define MYSQL_STMT_FETCH 28
...static void mysql_dissect_auth_switch_request(struct buffer *buf, mysql_conn_data_t *conn_data);
static void mysql_dissect_auth_switch_response(struct buffer *buf, mysql_conn_data_t *conn_data);
static void mysql_dissect_error_packet(struct buffer *buf);
static void mysql_set_conn_state(mysql_conn_data_t *conn_data, mysql_state_t state);
static void mysql_dissect_greeting(struct buffer *buf, mysql_conn_data_t *conn_data);
static void mysql_dissect_login(struct buffer *buf, mysql_conn_data_t *conn_data);
static int mysql_dissect_attributes(struct buffer *buf);
static void mysql_dissect_request(struct buffer *buf, mysql_conn_data_t *conn_data);
static void mysql_dissect_response(struct buffer *buf, mysql_conn_data_t *conn_data);
static void mysql_dissect_result_header(struct buffer *buf, mysql_conn_data_t *conn_data);
static void mysql_dissect_ok_packet(struct buffer *buf, mysql_conn_data_t *conn_data);
static void mysql_dissect_field_packet(struct buffer *buf, mysql_conn_data_t *conn_data);
static int mysql_dissect_session_tracker_entry(struct buffer *buf);
static void mysql_dissect_row_packet(struct buffer *buf);
static void mysql_dissect_exec_string(struct buffer *buf, uint8_t param_unsigned, int *param_idx);
static void mysql_dissect_exec_time(struct buffer *buf, uint8_t param_unsigned, int *param_idx);
static void mysql_dissect_exec_datetime(struct buffer *buf, uint8_t param_unsigned, int *param_idx);
static void mysql_dissect_exec_tiny(struct buffer *buf, uint8_t param_unsigned, int *param_idx);
static void mysql_dissect_exec_short(struct buffer *buf, uint8_t param_unsigned, int *param_idx);
static void mysql_dissect_exec_long(struct buffer *buf, uint8_t param_unsigned, int *param_idx);
static void mysql_dissect_exec_float(struct buffer *buf, uint8_t param_unsigned, int *param_idx);
static void mysql_dissect_exec_double(struct buffer *buf, uint8_t param_unsigned, int *param_idx);
static void mysql_dissect_exec_longlong(struct buffer *buf, uint8_t param_unsigned, int *param_idx);
static void mysql_dissect_exec_null(struct buffer *buf, uint8_t param_unsigned, int *param_idx);
static char mysql_dissect_exec_param(struct buffer *buf, int *param_idx, uint8_t param_flags);
static void mysql_dissect_response_prepare(struct buffer *buf, mysql_conn_data_t *conn_data);
static void mysql_print_bytes(const char *payload, size_t size);
...int main(int argc, char **argv)
{
...while (opt != -1){switch (opt){case 'i':opts->interface = strdup(optarg);assert(opts->interface);break;case 'p':i += snprintf(opts->expression + i, max_filter_sz - i - 1, "tcp and ( port 0 ");assert(i <= max_filter_sz - 1);while ((port = strsep(&optarg, ",")) != NULL){if (port){if (!atoi(port)){LOG_ERROR("端口号有误 %s", port);goto free;}opts->mysql_server_ports[opts->port_sz++] = atoi(port);i += snprintf(opts->expression + i, max_filter_sz - i - 1, "or port %d ", atoi(port));assert(i <= max_filter_sz - 1);if (opts->port_sz >= max_port_sz){LOG_ERROR("端口数超限 max=%d", max_port_sz);break;}}}i += snprintf(opts->expression + i, max_filter_sz - i - 1, ")");assert(i <= max_filter_sz - 1);break;case 'v':opts->verbose = !!optarg;break;case '?':usage();break;default:break;}opt = getopt(argc, argv, optString);optarg = str_trim(optarg, "=");}if (!opts->interface){opts->interface = strdup("eth0");assert(opts->interface);}
...struct mysql_ss *ss = mysql_ss_create(opts->mysql_server_ports, opts->port_sz);assert(ss);struct tcpsniff_opt sniffopt = {.snaplen = 65535,.pkt_cnt_limit = 0,.timeout_limit = 10,.device = opts->interface,.filter_exp = opts->expression,.ud = ss};...mysql_ss_release(ss);
...
}

If you need the complete source code, please add the WeChat number (c17865354792)

运行结果:




总结

MySQL协议是MySQL数据库管理系统在客户端和服务器之间通信时使用的协议。它规定了客户端如何向服务器发送请求,以及服务器如何向客户端返回响应。MySQL协议是一种基于文本的协议,使用ASCII码进行通信。

MySQL协议由多个命令组成,每个命令都有特定的格式和语法规则。其中包括连接、查询、插入、更新、删除等命令,用于实现数据库的各种操作。

在MySQL协议中,每个命令都以一个“包”的形式传输。一个包由多个字段组成,包括命令类型、序列号、参数等。客户端发送一个命令包,服务器接收后解析出命令类型和参数,然后执行相应的操作并返回响应。

Welcome to follow WeChat official account【程序猿编码

参考:《MySQL Internals Manual: MySQL Client/Server Protocol》

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/132098.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

django REST框架- Django-ninja

Django 是我学习的最早的web框架&#xff0c;大概在2014年&#xff0c;当时选他原因也很简单就是网上资料比较丰富&#xff0c;自然是遇到问题更容易找答案&#xff0c;直到 2018年真正开始拿django做项目&#xff0c;才对他有了更全面的了解。他是一个入门有门槛&#xff0c;学…

后端接口接收对象和文件集合,formdata传递数组对象

0 问题 后端接口需要接收前端传递过来的对象和文件集合&#xff1b;对象中存在数组对象 1 前端和后端 前端只能使用formdata来传递参数&#xff0c;后端不使用RequestBody注解 2 formdata传递数组对象 2.1 多个参数对象数组 addForm: {contactInfo: [{contactPerson: ,…

22款奔驰GLE450加装原厂360全景影像 打破死角

360全景影像影像系统提升行车时的便利&#xff0c;不管是新手或是老司机都将是一个不错的配置&#xff0c;无论是在倒车&#xff0c;挪车以及拐弯转角的时候都能及时关注车辆所处的环境状况&#xff0c;避免盲区事故发生&#xff0c;提升行车出入安全性。 360全景影像包含&…

BuhoCleaner for Mac:彻底改变您的Mac清理体验

BuhoCleaner for Mac是一款专为Mac用户打造的清理工具&#xff0c;它可以帮助您清理无用的文件、缓存、日志和其他垃圾&#xff0c;从而释放磁盘空间并提高系统性能。这款工具具有简单易用的界面和强大的清理功能&#xff0c;是Mac用户必备的清理工具之一。 特点 简单易用的界…

Oracle 19c 可插拔数据库PDB的创建方式

多租户容器数据库架构图总览 多租户容器数据库组成部分&#xff1a; 1.有且仅有一个CDB Root(CDB$ROOT)&#xff0c;它包含了Root和所有PDB数据库的元数据和数据字典信息。 2.有且仅有一个Seed PDB(PDB$SEED),它的作用是创建其他PDB的模板&#xff0c;它是只读库&#xff0c;…

应用开发平台集成表单设计器系列之1——技术预研与技术选型

背景 表单的可视化配置&#xff0c;是低代码开发平台的重要组成部分。平台已实现的低代码配置部分&#xff0c;可以配置生成前端vue页面&#xff0c;对于属性较少的实体&#xff0c;如系统基础数据的管理、配置数据的维护&#xff0c;采用标准化的模板模式来生成&#xff0c;配…

使用JMeter进行接口压力测试

1.我首先创建一个线程组 2.创建好之后如图所示 3. 进行配置 4. 然后添加一个https请求 5.创建好之后设置请求方法和对应参数 6.设置表格监听器 7.创建好之后如图所示 8.保存jmx文件后点击运行进行测试&#xff0c;结果反馈如下图

【数智化人物展】觉非科技CEO李东旻:数据闭环,智能驾驶数智时代发展的新引擎...

李东旻 本文由觉非科技CEO李东旻投递并参与《2023中国企业数智化转型升级先锋人物》榜单/奖项评选。 大数据产业创新服务媒体 ——聚焦数据 改变商业 数智化的主要作用是帮助决策。它的核心是大数据&#xff0c;以大数据为基础&#xff0c;匹配合适的AI技术&#xff0c;促使数…

leetcode刷题 - SQL - 简单

目录 1. 175组合两个表 左外连接 2. 181. 超过经理收入的员工 3. 182. 查找重复的电子邮箱 4. 196. 删除重复的电子邮箱 5. 197. 上升的温度 日期作差 6. 511. 游戏玩法分析 I 7. 577. 员工奖金 null条件运算 8. 584. 寻找用户推荐人 9. 586. 订单最多的客户 10. 595. 大的国家…

AD9371 官方例程裸机SW 和 HDL配置概述(二)

AD9371 系列快速入口 AD9371ZCU102 移植到 ZCU106 &#xff1a; AD9371 官方例程构建及单音信号收发 ad9371_tx_jesd -->util_ad9371_xcvr接口映射&#xff1a; AD9371 官方例程之 tx_jesd 与 xcvr接口映射 AD9371 官方例程 时钟间的关系与生成 &#xff1a; AD9371 官方…

第四届辽宁省大学生程序设计竞赛(正式赛)(12/13)

AC情况 赛中通过赛后通过暂未通过A√B√C√D○E○F√G√H√I○J√K—L√M√ 整体体验 easy&#xff1a;ABFHL mid&#xff1a;MJGC hard&#xff1a;IDKE 心得 感觉出了一堆典题&#xff0c;少数题还有些意思&#xff0c;E题确实神仙 题解 A. 欢迎来到辽宁省赛&#x…

图解系列--查漏补缺

1. L2转发&#xff0c;L3转发 网络传输中&#xff0c;每个节点会根据分组数据的地址信息&#xff0c;来判断该报文应该由哪个网卡发送出去。为此&#xff0c;各个地址会参考一个发出接口列表。在这一点上 MAC 寻 址与IP 寻址是一样的。只不过MAC 寻址中所参考的这张表叫做地址…

【双指针+简化去重操作】Leetcode 15 三数之和

【双指针简化操作】Leetcode 15 三数之和 解法1 解法1 新建一个嵌套列表&#xff1a;List<List<Integer>> result new List<>(); 初始化一个ArrayList并直接赋值&#xff1a;ArrayList<Integer> result new ArrayList<>(Arrays.asList(1, 2…

又来安利了,这个Itbuilder在线数据库设计工具用起来太顺手了

对于测试、开发、DBA、运维来说&#xff0c;数据库是再熟悉不过了。 我们都知道如今的数据是多么复杂和难以管理&#xff0c;但幸运的是有数据库设计工具可以帮助我们&#xff0c;可以在市场上找到很多的数据库设计工具&#xff0c;包括itbuilder。这些数据库设计工具可以帮助我…

【Python语言】集合的使用方法总结

目录 1、集合基本知识&#xff1a; 2、定义 2.1 定义集合变量 2.2 定义空集合 3、集合的常用操作 3.1 定义集合 3.2 添加新元素 3.3 移除元素 3.4 从集合中随机取出元素 3.5 清空集合 3.6 取两个集合的差集 3.7 消除两个集合的差集 3.8 两个集合合并 3.9 统计集合…

任正非说:我们要在整体上形成海军陆战队和主力作战团队相配合的作战方案。

你好&#xff01;这是华研荟【任正非说】系列的第30篇文章&#xff0c;让我们聆听任正非先生的真知灼见&#xff0c;学习华为的管理思想和管理理念。 一、我们的业务量在增长&#xff0c;因此带来表面上人的效益是增长的。但是我们要看到&#xff0c;我们现在利润不是来自于管理…

改进YOLO系列:12.Repulsion损失函数【遮挡】

1. RepLoss论文 物体遮挡问题可以分为类内遮挡和类间遮挡两种情况。类间遮挡产生于扎堆的同类物体,也被称为密集遮挡(crowd occlusion)。Repulsion损失函数由三个部分构成,yolov5样本匹配,得到的目标框和预测框-一对应第一部分主要作用:预测目标框吸引IOU最大的真实目标框,…

2023辽宁省数学建模A题铁路车站的安全标线完整原创论文详细讲解(含matlab代码)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了辽宁省数学建模A题完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 B预计下午两点前更新完毕&#xff0c;A全…

Go类型嵌入介绍和使用类型嵌入模拟实现“继承”

Go类型嵌入介绍和使用类型嵌入模拟实现“继承” 文章目录 Go类型嵌入介绍和使用类型嵌入模拟实现“继承”一、独立的自定义类型二、继承三、类型嵌入3.1 什么是类型嵌入 四、接口类型的类型嵌入4.1 接口类型的类型嵌入介绍4.2 一个小案例 五、结构体类型的类型嵌入5.1 结构体类…

ElasticSearch 实现 全文检索 支持(PDF、TXT、Word、HTML等文件)通过 ingest-attachment 插件实现 文档的检索

一、Attachment 介绍 Attachment 插件是 Elasticsearch 中的一种插件&#xff0c;允许将各种二进制文件&#xff08;如PDF、Word文档等&#xff09;以及它们的内容索引到 Elasticsearch 中。插件使用 Apache Tika 库来解析和提取二进制文件的内容。通过使用 Attachment 插件&a…