【MySQL数据库】C/C++连接数据库

发布于:2025-05-09 ⋅ 阅读:(15) ⋅ 点赞:(0)

        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。