目录
[mysql_init - 初始化](#mysql_init - 初始化)
[mysql_real_connect - 连接](#mysql_real_connect - 连接)
[mysql_set_character_set - 设置字符集](#mysql_set_character_set - 设置字符集)
[mysql_query - 发送指令](#mysql_query - 发送指令)
[mysql_close - 关闭](#mysql_close - 关闭)
引入库和头文件
bash
yum install mysql-devel
接口介绍
mysql_init - 初始化
要使用库,必须先进行初始化
函数原型
bash
MYSQL *mysql_init(MYSQL *mysql)
返回值 MYSQL* 是结构体指针。MYSQL 结构体包含连接的 MySQL 的属性,类似于 FLIE*
使用示例
bash
MYSQL *my = mysql_init(NULL);
if(my == nullptr)
{
std::cerr << "init mysql error" << std::endl;
return 1;
}
mysql_real_connect - 连接
函数原型和参数含义
bash
MYSQL *mysql_real_connect(
MYSQL *mysql, // 已初始化的连接句柄
const char *host, // 主机名或IP地址
const char *user, // 用户名
const char *passwd, // 密码
const char *db, // 要连接的数据库名
unsigned int port, // 端口号,0表示默认(3306)
const char *unix_socket, // Unix socket或命名管道,通常为NULL
unsigned long client_flag // 客户端标志,通常为0
);
//连接成功时,函数会返回与第一个参数相同的 MYSQL* 指针;如果失败,则返回 NULL,此时可以通过
//mysql_error() 获取具体的错误信息
各参数细节如下:
mysql:一个由mysql_init(NULL)初始化得到的连接句柄,所有后续操作都依赖于它。
host:要连接的 MySQL 服务器地址。
传
NULL或"localhost"表示连接本机。在 Unix/Linux 下会优先使用 socket 文件,在 Windows 下会尝试使用共享内存或命名管道。传 IP 地址或域名则会使用 TCP/IP 协议进行连接。
user和passwd:登录凭证。密码不需要在外部提前加密,mysql_real_connect会自动处理。
- 如果
passwd传NULL,客户端会尝试进行无密码登录(仅当该用户允许空密码时才能成功)。
db:想要连接的默认数据库名。如果传NULL,连接成功后需要手动调用mysql_select_db()来选择数据库。
port:MySQL 服务器的端口号。传入0表示使用默认端口3306。
unix_socket:在 Unix/Linux 下,可通过此参数指定 socket 文件的路径。通常情况下,传入NULL即可。
client_flag:用于开启特定功能,比如启用压缩传输(CLIENT_COMPRESS)或支持多语句执行(CLIENT_MULTI_STATEMENTS)。大部分情况下,传入0即可满足基本需求。
mysql_set_character_set - 设置字符集
//建立好链接之后,获取英文没有问题,如果获取中文是乱码:
//设置链接的默认字符集是utf8,原始默认是latin1
mysql_set_character_set(myfd, "utf8");
mysql_query - 发送指令
函数原型
bash
int mysql_query(MYSQL *mysql, const char *q);
第一个参数上面已经介绍过,第二个参数为要执行的 sql 语句,如"select * from table"。
获取查询结果
结果转储
sql执行完以后,如果是查询语句,我们当然还要读取数据,如果update,insert等语句,那么就看下操 作成功与否即可。我们来看看如何获取查询结果: 如果mysql_query返回成功,那么我们就通过 mysql_store_result这个函数来读取结果
函数原型
MYSQL_RES *mysql_store_result(MYSQL *mysql);
select 的查询结果,就保存在 MYSQL 结构体中,该函数的作用就是将保存在 MYSQL 结构体中的查询结果,复制到 MYSQL_RES 结构体中。
使用示例
std::string sql = "select * from user";
int n = mysql_query(my, sql.c_str());
if(n == 0) std::cout << sql << " success" << std::endl;
else
{
std::cerr << sql << " failed" << std::endl;
return 3;
}
MYSQL_RES *res = mysql_store_result(my);
if(nullptr == res)
{
std::cerr << "mysql_store_result error" << std::end1;
return 4;
}
获取行数和列数
获取结果行数
my_ulonglong mysql_num_rows(MYSQL_RES *res);
获取结果列数
unsigned int mysql_num_fields(MYSQL_RES *res);
获取列属性
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
该函数会返回一个结构体数组指针,每个元素的类型是 MYSQL_FIELD 结构体,该结构体保存了 列的各种属性,比如列名、列的数据类型、所在的数据库名等等。
使用示例
int fields = mysql_num_fields(res);
MYSQL_FIELD *field = mysql_fetch_fields(res);
for(int i = 0; i < fields; i++)
{
cout << field[i].name <<" ";
}
cout<<endl;
获取结果内容
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
- 每次调用,会返回一个 MYSQL_ROW 指针,其实就是 char** 类型的指针,它指向结果的某一列。
- 每次调用,mysql_fetch_row 会自动指向下一行,下次调用就返回指向下一行的 char** 类型的指针
使用示例
MYSQL_ROW line;
for(int i = 0; i < nums; i++)// nums 是之前获取的行数
{
line = mysql_fetch_row(res);
for(int j = 0; j < fields; j++) // fields 是之前获取的列数
{
cout << line[j] << '\t';
}
cout << endl;
}
释放查询结果
select 的查询结果是保存在 MYSQL_RES 结构体中的,而MYSQL_RES 结构体是申请的堆空间,因此如果不再使用,就要释放空间。
函数原型
void mysql_free_result(MYSQL_RES *result);
注意:result 必须是经过 mysql_store_result 返回的指针(也就是说必须是指向开辟了空间的MYSQL_RES结构体)。
mysql_close - 关闭
使用完后,要关闭,类似于 fclose 。
函数原型
bash
void mysql_close(MYSQL *sock);
使用示例
bash
mysql_close(my);