MySQL要想在C/C++下使用,就必须要有 MySQL 提供的头文件和相关的库。
在Ubuntu系统上,使用 apt install mysql-server 安装MySQL服务器后,仅安装了MySQL数据库服务本身,并没有安装MySQL开发所需的库和头文件。因此,在尝试用C/C++编写访问MySQL数据库的应用程序时,编译器找不到相应的MySQL头文件(如)和相关的库,导致无法正常编译。
使用C/C++访问数据库时,需要安装MySQL提供的开发包,这些包包含了进行MySQL开发所需的头文件和库文件。Ubuntu系统下安装的MySQL服务,可以使用以下指令安装MySQL开发库。
sudo apt install default-libmysqlclient-dev
注意:MySQL开发库的版本要与MySQL服务器一致,否则某些情况下会出现不兼容问题。
在Ubuntu系统下安装好MySQL后,头文件在 /usr/include/mysql 路径下(/usr/include是系统搜索头文件的默认路径),库文件在 /usr/lib/x86_64-linux-gnu/ 路径下(系统链接库时默认的查找路径)。
下面通过 mysql_get_client_info() 函数,来验证我们的引入是否成功。
#include <cstdio>
#include <mysql/mysql.h>
int main()
{
printf("mysql client Version: %s\n", mysql_get_client_info());
return 0;
}
// 下面指令生成失败,因为没有链接MySQL库
zhu@iv-ydi2mepybkcva4ghjhmx:~/mysql$ g++ test.cc -o test
// 链接MySQL库,成功生成
zhu@iv-ydi2mepybkcva4ghjhmx:~/mysql$ g++ test.cc -o test -lmysqlclient
C/C++对应MySQL的接口和使用流程请观看此文章:MySQL操作函数接口。
MySQL通用接口:
初始化一个MYSQL连接的实例对象。
MYSQL * mysql_init(MYSQL *mysql);
连接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 服务器发送 SQL 语句并执行它。
int mysql_query(MYSQL *mysql, const char *stmt_str);
获取MySQL结果:
mysql_store_result是从 MySQL 服务器获取查询结果集的一个函数。当执行了一个select 查询或其他会产生结果集的查询(如show)后,可以使用该函数来将整个结果集一次性加载到客户端内存中。
MYSQL_RES *mysql_store_result(MYSQL *mysql);
mysql_store_result 获取结果集后,下面就是读取获取结果集中的数据。
获取结果行数: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_ROW mysql_fetch_row(MYSQL_RES *result);
说明:my_ulonglong其实就是int64_t;
MYSQL_FIELD是一个结构体,mysql_fetch_fields实际返回的就是结构体数 组,数组的每个元素对应一个列的属性信息;
MYSQL_ROW其实就是char**,可以当成一个二维数组来用,每一列对应数组中 的一个元素
注意:
1,建立好链接之后,获取英文没有问题,如果获取中文是乱码,那么说明设置链接的字符集与数据库不匹配。这里需要运用 mysql_set_character_set 修改字符集。
mysql_set_character_set(myfd, "utf8"); myfd使用utf8字符集,原始默认是latin1
2,mysql_store_result函数存储结果集时,内部malloc了一片内存空间来存储查询过来的数据,执行完毕后,需要 void mysql_free_result(MYSQL_RES *result) 函数来释放资源。
代码实例请在此链接下观看:C++代码运用MySQL
下面来说明下 show processlist 命令。
show processlist 是 MySQL 中用于显示当前所有连接到 MySQL 服务器的连接(即线程)以及其状态的命令。每个连接在 MySQL 中都表示为一个线程。该指令提供了查看这些线程详细信息的方法。输出字段说明如下:
- Id:每个线程的唯一标识符。
- User:发起该线程的用户名。
- Host:发起该线程的客户端主机名或IP地址(以及端口号)。如果通过TCP/IP连接,格式通常是:[hostname]:[port];如果是本地连接,则可能是localhost
。
- db:当前线程正在使用的数据库名称。如果没有选择任何数据库,则此列为NULL。
- Command:线程正在执行的操作类型。例如,sleep表示线程处于空闲等待状态;query表示线程正在执行查询。
- Time:线程处于其当前状态的时间,以秒为单位。
- State:线程的状态,提供了关于线程当前活动的更详细的信息。不同的命令可能有不同的状态。
- Info:正在执行的SQL语句文本。如果线程没有执行任何语句,则此列为NULL。