要使用C语言连接MySQL数据库,可以使用MySQL提供的C API
mysql_get_client_info()
mysql_get_client_info()
是 MySQL C API 提供的一个函数,用于获取当前使用的 MySQL 客户端库的版本信息。
函数原型如下:
const char *mysql_get_client_info(void);
例:
#include
#include
using namespace std;
int main() {
cout << "mysql client version: " << mysql_get_client_info() << endl;
return 0;
}
结果:
mysql client version: 5.5.68-MariaDB
注意:要使用-lmysqlclient
选项
mysql_init()
用于初始化一个 MySQL 连接对象。它返回一个指向 MYSQL
结构体的指针,该结构体代表了一个 MySQL 连接。
函数原型:
MYSQL *mysql_init(MYSQL *mysql);
mysql_init()
接受一个可选的 MYSQL
结构体指针参数 mysql
,用于指定要初始化的连接对象。如果传递了 NULL
,则会创建一个新的 MYSQL
对象。
对于使用 mysql_init()
初始化的 MySQL 连接对象,需要在使用完后显式关闭连接,以释放相关资源。关闭连接可以使用 mysql_close()
函数。
例:
#include
#include
using namespace std;
int main() {
// 初始化连接对象
MYSQL *conn = mysql_init(nullptr);
if (conn == nullptr) {
cerr << "Failed to initialize MySQL connection.\n";
return 1;
}
// 处理连接对象...
// 关闭连接对象
mysql_close(conn);
return 0;
}
在上述代码中,通过调用 mysql_init(NULL)
初始化了一个 MySQL 连接对象。如果初始化成功,将返回一个有效的 MYSQL
指针;否则,返回 NULL
。在实际使用时,需要检查返回的指针是否为 NULL
,以确保连接对象的创建成功。最后需要使用 mysql_close()
来关闭连接对象
mysql_real_connect()
用于建立与 MySQL 服务器的连接。它提供了更详细的选项和参数,可以用于配置连接的各种属性和行为。
函数原型如下:
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user,
const char *passwd, const char *db,
unsigned int port, const char *unix_socket,
unsigned long client_flag);
参数说明:
mysql
:一个已初始化的 MYSQL
对象,表示要建立连接的连接对象。host
:MySQL 服务器的主机名或 IP 地址。user
:连接 MySQL 服务器的用户名。passwd
:连接 MySQL 服务器的密码。db
:要连接的数据库名。可以为 NULL
,表示不选择默认数据库。port
:MySQL 服务器的端口号。可以为 0,表示使用默认端口。unix_socket
:UNIX 域套接字路径,用于与本地 MySQL 服务器通信。可以为 NULL
,表示使用 TCP/IP 连接。client_flag
:客户端标志,用于配置连接的各种选项和行为,如设置字符集、启用 SSL 等。可以使用 CLIENT_*
常量进行标志的组合。例:
#include
#include
#include
using namespace std;
string host = "localhost"; // '127.0.0.1'
string user = "root";
string passwd;
string db = "test_db";
unsigned int port = 8080;
int main() {
// 初始化连接对象
MYSQL *conn = mysql_init(nullptr);
if (conn == nullptr) {
cerr << "Failed to initialize MySQL connection.\n";
return 1;
}
// 建立连接
if (mysql_real_connect(conn, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr) {
cerr << mysql_error(conn) << endl;
return 1;
}
cout << "mysql_real_connect success" << endl;
// 处理连接对象...
// 关闭连接对象
mysql_close(conn);
return 0;
}
mysql_query()
用于向 MySQL 服务器发送 SQL 查询或语句,并执行该查询或语句。
函数原型如下:
int mysql_query(MYSQL *mysql, const char *query);
参数说明:
mysql
:一个已连接的 MYSQL
对象,表示要执行查询的连接对象。query
:要执行的 SQL 查询或语句的字符串。mysql_query()
函数将传入的 SQL 查询或语句发送到 MySQL 服务器,并执行它。执行结果取决于查询或语句的类型。对于 SELECT 查询,可以使用 mysql_store_result()
函数获取查询结果集。对于其他类型的查询或语句,可以使用 mysql_affected_rows()
函数获取受影响的行数。
如果执行查询或语句成功,mysql_query()
函数将返回 0
;否则,返回非零值。
mysql_store_result()
用于将查询结果一次性读取到客户端内存中,并返回一个指向 MYSQL_RES
结构体的指针。
函数原型如下:
MYSQL_RES *mysql_store_result(MYSQL *mysql);
参数说明:
mysql
:一个已连接的 MYSQL
对象,表示要处理查询结果的连接对象。mysql_store_result()
返回一个指向 MYSQL_RES
结构体的指针,该结构体包含了查询结果集的相关信息,如列数、行数、字段名称等。
mysql_fetch_row()
用于从查询结果集中获取下一行数据,并返回一个指向结果行数据的指针。
函数原型如下:
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
参数说明:
result
:一个指向 MYSQL_RES
结构体的指针,表示要获取数据的结果集。mysql_fetch_row()
函数用于遍历查询结果集的行数据。每次调用该函数,它会返回结果集的下一行数据,并将结果以字符串数组(char**
)的形式返回。
mysql_free_result()
函数用于释放通过 mysql_store_result()
或 mysql_use_result()
获取的查询结果集所占用的内存资源。在完成对结果集的处理后,应调用该函数来释放内存,以避免内存泄漏。
例:
#include
#include
#include
using namespace std;
string host = "localhost"; // '127.0.0.1'
string user = "root";
string passwd;
string db = "test_db";
unsigned int port = 8080;
int main() {
// 初始化连接对象
MYSQL *conn = mysql_init(nullptr);
if (conn == nullptr) {
cerr << "Failed to initialize MySQL connection.\n";
return 1;
}
mysql_options(conn, MYSQL_SET_CHARSET_NAME, "utf8"); // 设置连接字符集为 utf8,防止中文乱码
// 建立连接
if (mysql_real_connect(conn, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr) {
cerr << mysql_error(conn) << endl;
return 1;
}
cout << "mysql_real_connect success" << endl;
// 执行查询并获取结果集
string sql = "select * from users";
if (mysql_query(conn, sql.c_str())) {
cerr << mysql_error(conn);
return 1;
}
MYSQL_RES *result = mysql_store_result(conn);
//遍历结果集合并输出
MYSQL_ROW row;
while ((row = mysql_fetch_row(result)) != nullptr) {
printf("%s\t%s\t%s\n", row[0], row[1], row[2]);
}
// 释放结果集
mysql_free_result(result);
// 关闭连接对象
mysql_close(conn);
return 0;
}
在上述代码中,使用 mysql_fetch_row()
函数在一个 while
循环中遍历结果集的每一行数据,并通过访问 row
数组中的元素输出数据。row
数组的索引对应结果集中的列索引,从 0
开始。最后,使用 mysql_free_result()
函数释放结果集的内存资源。
结果:
mysql_real_connect success
7 张小凡 1329ebf6352bb67d4e2f6e2024d2f72c
8 王小磊 6e49be674cee12dc2f333296c675db49
9 李婷婷 135abaf36b2e5803c97a6db4c1fe83c6
10 赵丽丽 45791c398b4dab808a8c1ae2bf8caaac
11 刘伟东 a0aada9b4933edd0f5da12c3194b6d5f
12 陈冬梅 b410ad83ff45a3f9ec91bb8ddbdb4096
其他关于查询结果的函数:
获取结果行数
my_ulonglong mysql_num_rows(MYSQL_RES *res);
获取结果列数
unsigned int mysql_num_fields(MYSQL_RES *res);
获取列名
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);