嵌入式MySQL是一种在应用程序本身中嵌入MySQL库的MySQL版本,它可以在没有独立可执行MySQL服务器的情况下,直接与应用交互。在嵌入式MySQL中,可以使用MySQL客户端的API来访问数据库,就像在独立的MySQL服务器上一样。
对于嵌入式MySQL,数据结构非常重要。在应用程序中使用嵌入式MySQL,必须了解其数据结构。下面是一些常见的数据结构:
/* mysql.h中定义一些基本的数据类型 */
typedef char my_bool;
typedef unsigned char uchar;
typedef unsigned short ushort;
typedef unsigned int uint;
typedef unsigned long ulong;
/* 定义在mysql.h中的结构体定义 */
struct st_mysql;
struct st_mysql_res;
struct st_mysql_field;
/* mariadb_com.h中只是一些常量和enum */
这是通过mysql.h中定义的结构体定义MySQL的句柄结构体。它包含与MySQL服务器的连接以及与会话相关的所有信息。当您使用嵌入式MySQL时,您应该始终将my.cnf配置文件中的必要选项设置为在该文件中定义:
struct st_mysql
{
NET net;
char *host,*user,*passwd,*unix_socket,*server_version,*host_info,*info,*db;
unsigned int port,client_flag,server_capabilities,protocol_version,errno;
unsigned long thread_id;
my_bool free_me; //mysql_close还是直接free
my_bool reconnect; //连接失败后,是否执行重连
char *stmt_cheat;
unsigned int server_language;
struct st_list *stmts; //handle prepared statement, conn->stmts是一个链表,每个元素代表一个st_mysql_stmt结构
const struct ma_charset_info_st *charset;
uchar *last_errno;
ulong last_error;
ulong affected_rows;
ulong insert_id;
my_bool unbuffered_fetch_cancelled;
my_bool ready_for_next_result;
};
此外,还有两个定义在mysql.h中的非常重要的结构体:st_mysql_res和st_mysql_field:
/* 结果集,不再使用USE_DYNCALL*/
typedef struct st_mysql_res {
unsigned long row_count;
unsigned long field_count;
MYSQL_FIELD *fields;
MYSQL_DATA *data;
MYSQL_ROWS *data_cursor;
MEM_ROOT field_alloc;
MEM_ROOT row_alloc;
MYSQL_ROW current_row;
unsigned long *lengths;
void *handle; //stmt或者QUERY_RESULT
const char *eof; //与当前协议一致,结束报文
my_bool eof_flag; //是否结束
char *info; //所有的数据库错误信息和SQLSTATE,最末加上空字符
char *extension; // like tail
} MYSQL_RES;
/* 结构体定义了一个单独的字段,该字段可以是表结构的一部分。 */
typedef struct st_mysql_field {
char *name; /* 字段名称 */
char *org_name; /* 原始名称,用于位字段 */
char *table; /* 表名 */
char *org_table; /* 原始表名,用于位字段 */
char *db; /* 数据库名 */
char *catalog; /* 目录名 */
char *def; /* 缺省值 */
unsigned long length; /* 枚举值列表,SET列表的逗号分隔符 */
unsigned long flags; /* 标志解析 */
unsigned long decimals; /* 小数位数 */
unsigned long charsetnr; /* 编码 */
enum enum_field_types type; /* 字段类型 */
void *extension;
} MYSQL_FIELD;
在此基础上,我们可以非常方便地编写嵌入式MySQL应用程序。如果您需要制作应用程序,在使用嵌入式MySQL时,请务必了解这些重要的数据结构。