一、一般常用函数
1.函数
1)MYSQL *mysql_init()
初始化MySQL库,创建一个MySQL对象,用于后续的数据库连接和操作。
-
- 返回值:一个指向新创建的MySQL对象的指针。
- 参数:无
2)MYSQL *mysql_real_connect()
连接到MySQL服务器,建立与数据库的通信连接。
-
- 返回值:一个指向MySQL连接的指针,如果连接失败则返回NULL。
- 参数:
- MYSQL *mysql:mysql_init() 返回的MySQL对象。
- const char *host:MySQL服务器主机名或IP地址。
- const char *user:数据库用户的用户名。
- const char *passwd:数据库用户的密码。
- const char *db:要连接的数据库名称。
- unsigned int port:MySQL服务器端口号。
- const char *unix_socket:UNIX套接字文件路径(如果使用UNIX域套接字连接)。
3)int mysql_query()
执行SQL查询。
-
- 返回值:0表示成功,非零值表示失败。
- 参数:
- MYSQL *mysql:已建立的MySQL连接。
- const char *query:要执行的SQL查询语句。
4)MYSQL_RES *mysql_store_result()
将查询结果存储在内存中以供后续处理。
-
- 返回值:一个指向查询结果集的指针。
- 参数:MYSQL *mysql 已建立的MySQL连接。
5)MYSQL_ROW mysql_fetch_row()
从查询结果集中获取一行数据。
-
- 返回值:一个指向结果集中当前行的数据的指针数组。
- 参数:MYSQL_RES *result 查询结果集。
6)unsigned int mysql_num_fields()
获取结果集中的字段数。
-
- 返回值:结果集中的字段数。
- 参数:MYSQL_RES *result 查询结果集。
7)my_ulonglong mysql_num_rows()
获取结果集中的行数。
-
- 返回值:结果集中的行数。
- 参数:MYSQL_RES *result 查询结果集。
8)void mysql_free_result()
释放查询结果集资源,释放内存。
-
- 参数:MYSQL_RES *result 查询结果集。
9)void mysql_close()
关闭MySQL连接。
- 参数:MYSQL *mysql:要关闭的MySQL连接。
10)const char *mysql_error()
获取最后一次MySQL操作的错误信息。
-
- 返回值:一个指向错误消息字符串的指针。
- 参数:无
11)my_ulonglong mysql_affected_rows()
用于确定前一次更改数据库时影响了多少行。
-
- 返回值:受上一次INSERT、UPDATE或DELETE操作影响的行数。
- 参数:MYSQL *mysql:已建立的MySQL连接。
12)unsigned long mysql_real_escape_string()
对字符串进行SQL转义,以防止SQL注入攻击。
-
- 返回值:已转义的字符串的长度。
- 参数:
- MYSQL *mysql:已建立的MySQL连接。
- char *to:目标缓冲区,用于存储转义后的字符串。
- const char *from:要转义的原始字符串。
- unsigned long length:要转义的原始字符串的长度。
13)unsigned long *mysql_fetch_lengths()
获取结果集中每个字段值的长度,通常用于处理返回的数据。
-
- 返回值:一个指向包含结果集中每个字段值长度的数组的指针。
- 参数:
- MYSQL_RES *result:查询结果集。
14)int mysql_ping()
检查MySQL服务器是否仍然可用,可以用于维护连接的健康状态。
-
- 返回值:0表示成功,非零值表示失败。
- 参数:MYSQL *mysql:已建立的MySQL连接。
2.使用示例
#include <mysql/mysql.h> // 包含MySQL C API头文件
int main() {
MYSQL *mysql = mysql_init(NULL); // 初始化MySQL库,创建MySQL对象
if (mysql == NULL) {
fprintf(stderr, "mysql_init() 失败\n");
return 1;
}
if (mysql_real_connect(mysql, "localhost", "username", "password", "mydatabase", 3306, NULL, 0) == NULL) {
fprintf(stderr, "mysql_real_connect() 失败: %s\n", mysql_error(mysql));
mysql_close(mysql);
return 1;
}
if (mysql_query(mysql, "SELECT * FROM mytable")) { // 执行SQL查询
fprintf(stderr, "mysql_query() 失败: %s\n", mysql_error(mysql));
mysql_close(mysql);
return 1;
}
MYSQL_RES *result = mysql_store_result(mysql); // 存储查询结果
if (result == NULL) {
fprintf(stderr, "mysql_store_result() 失败: %s\n", mysql_error(mysql));
mysql_close(mysql);
return 1;
}
int num_fields = mysql_num_fields(result); // 获取结果集中的字段数
MYSQL_ROW row;
while ((row = mysql_fetch_row(result))) { // 逐行获取查询结果
for (int i = 0; i < num_fields; i++) {
printf("%s ", row[i] ? row[i] : "NULL");
}
printf("\n");
}
int num_rows = mysql_num_rows(result); // 获取结果集中的行数
printf("总共 %d 行数据\n", num_rows);
mysql_free_result(result); // 释放结果集资源
mysql_close(mysql); // 关闭MySQL连接
return 0;
}
二、预编译SQL相关函数
1.函数
1)MYSQL_STMT *mysql_stmt_init()
初始化MySQL预处理语句,用于执行多次相似的查询。
-
- 返回值:一个指向新创建的MySQL预处理语句对象的指针。
- 参数:
- MYSQL *mysql:已建立的MySQL连接。
2)int mysql_stmt_prepare()
准备MySQL预处理语句,绑定SQL语句以供后续执行。
-
- 返回值:0表示成功,非零值表示失败。
- 参数:
- MYSQL_STMT *stmt:预处理语句对象。
- const char *query:要执行的SQL查询语句。
3)int mysql_stmt_bind_param()
将参数绑定到预处理语句中的占位符。
-
- 返回值:0表示成功,非零值表示失败。
- 参数:
- MYSQL_STMT *stmt:预处理语句对象。
- MYSQL_BIND *bind:一个指向MYSQL_BIND结构的数组,包含要绑定的参数信息。
4)int mysql_stmt_bind_result()
用于绑定输出参数到预编译的 SQL 语句中,以接收查询结果。
- 返回值:0 表示成功,非零值表示失败。
- 参数:
MYSQL_STMT *stmt
:预处理语句对象。MYSQL_BIND *bind
:一个指向MYSQL_BIND结构的数组,用于绑定查询结果的输出参数。
5)int mysql_stmt_execute()
执行MySQL预处理语句。
-
- 返回值:0表示成功,非零值表示失败。
- 参数:
- MYSQL_STMT *stmt:要执行的预处理语句对象。
6)int mysql_stmt_store_result()
将预处理语句的结果存储在内存中以供后续处理。
-
- 返回值:0表示成功,非零值表示失败。
- 参数:
- MYSQL_STMT *stmt:预处理语句对象。
7)int mysql_stmt_fetch()
从预处理语句的结果集中获取一行数据。
-
- 返回值类型:int
- 返回值:0表示成功获取一行数据,1表示到达结果集的末尾,非零值表示失败。
- 参数:
- MYSQL_STMT *stmt:预处理语句对象。
8)int mysql_stmt_close()
用于关闭预处理语句,释放相关资源。
- 返回值:0 表示成功,非零值表示失败。
- 参数:
MYSQL_STMT *stmt
:要关闭的预处理语句对象。
2.使用示例
#include <mysql/mysql.h> // 包含MySQL C API头文件
int main() {
MYSQL *mysql = mysql_init(NULL); // 初始化MySQL库,创建MySQL对象
if (mysql == NULL) {
fprintf(stderr, "mysql_init() 失败\n");
return 1;
}
if (mysql_real_connect(mysql, "localhost", "username", "password", "mydatabase", 3306, NULL, 0) == NULL) {
fprintf(stderr, "mysql_real_connect() 失败: %s\n", mysql_error(mysql));
mysql_close(mysql);
return 1;
}
MYSQL_STMT *stmt = mysql_stmt_init(mysql); // 初始化MySQL语句句柄
if (stmt == NULL) {
fprintf(stderr, "mysql_stmt_init() 失败\n");
mysql_close(mysql);
return 1;
}
const char *sql = "SELECT name, age FROM people WHERE id=?";
if (mysql_stmt_prepare(stmt, sql, strlen(sql))) { // 准备SQL语句
fprintf(stderr, "mysql_stmt_prepare() 失败: %s\n", mysql_error(mysql));
mysql_stmt_close(stmt);
mysql_close(mysql);
return 1;
}
int id = 1; // 用于绑定的参数
MYSQL_BIND input_bind;
memset(&input_bind, 0, sizeof(input_bind));
input_bind.buffer_type = MYSQL_TYPE_LONG;
input_bind.buffer = &id;
input_bind.is_null = 0;
input_bind.length = 0;
if (mysql_stmt_bind_param(stmt, &input_bind)) { // 绑定输入参数
fprintf(stderr, "mysql_stmt_bind_param() 失败: %s\n", mysql_error(mysql));
mysql_stmt_close(stmt);
mysql_close(mysql);
return 1;
}
if (mysql_stmt_execute(stmt)) { // 执行预编译的SQL语句
fprintf(stderr, "mysql_stmt_execute() 失败: %s\n", mysql_error(mysql));
mysql_stmt_close(stmt);
mysql_close(mysql);
return 1;
}
MYSQL_BIND result_bind[2]; // 用于绑定查询结果的输出参数
memset(result_bind, 0, sizeof(result_bind));
char name[50];
int age;
result_bind[0].buffer_type = MYSQL_TYPE_STRING;
result_bind[0].buffer = name;
result_bind[0].buffer_length = sizeof(name);
result_bind[0].is_null = 0;
result_bind[1].buffer_type = MYSQL_TYPE_LONG;
result_bind[1].buffer = &age;
result_bind[1].is_null = 0;
result_bind[1].length = 0;
if (mysql_stmt_bind_result(stmt, result_bind)) { // 绑定输出参数
fprintf(stderr, "mysql_stmt_bind_result() 失败: %s\n", mysql_error(mysql));
mysql_stmt_close(stmt);
mysql_close(mysql);
return 1;
}
while (mysql_stmt_fetch(stmt) == 0) { // 逐行获取查询结果
printf("Name: %s, Age: %d\n", name, age);
}
mysql_stmt_close(stmt); // 关闭预编译的SQL语句句柄
mysql_close(mysql); // 关闭MySQL连接
return 0;
}