MySQL用C/C++连接

连接库下载

  1. 要想用C语言连接mysql,我们需要从mysql官网下载mysql提供的连接库

    选择C API

然后选择MySQL Connector/C++ 8.0

最后挑选自己的配置即可。

  1. 如果我们一开始使用yum源安装的话,他已经自动帮我们安装了连接库了,无需手动安装。

  2. 我们还可以用apt包直接下载:

shell 复制代码
sudo apt update
sudo apt install libmysqlclient-dev

最后我们可以检测是否存在mysql.h:

shell 复制代码
zhangwho@VM-0-2-ubuntu:~$ find /usr -name "mysql.h"
/usr/include/mysql/mysql.h

mysql接口介绍

我们可以用官网获取详细的接口介绍。

那么我们先介绍一些简单的接口:

首先要初始化:

cpp 复制代码
mysql_init()

可以看到其返回MYSQL*:

然后就要连接:

cpp 复制代码
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host,
                          const char *user,
                          const char *passwd,
                          const char *db,
                          unsigned int port,
                          const char *unix_soc unsigned long clientflag);

为了便于测试,我们先创建用于连接的用户和数据库:

sql 复制代码
mysql> create database conn;
Query OK, 1 row affected (0.02 sec)

mysql> use conn;
Database changed
mysql> create table test(
    -> id int primary key auto_increment,
    -> name varchar(20) not null,
    -> age tinyint default 18
    -> );
Query OK, 0 rows affected (0.04 sec)

mysql> grant all on conn.* to 'conn'@'localhost';
Query OK, 0 rows affected (0.01 sec)

连接数据库后通过mysql_query调用mysql:

cpp 复制代码
int mysql_query(MYSQL *mysql, const char *q);

我们先简单连接一下:

cpp 复制代码
#include <iostream>
#include <mysql/mysql.h>

int main()
{
    MYSQL* mysql=mysql_init(nullptr);
    mysql=mysql_real_connect(mysql,"localhost","conn","123456","conn",3306,nullptr,0);
    if(mysql==nullptr)
        std::cerr<<"mysql connect errot\n";
    mysql_close(mysql);
    return 0;
}

当然这样不能有什么效果,我们故意将密码写错:

shell 复制代码
zhangwho@VM-0-2-ubuntu:~/Trainning/2026_1_29$ ./test 
mysql connect error

很好,接下里我们尝试插入数据:

cpp 复制代码
#include <iostream>
#include <mysql/mysql.h>

int main()
{
    MYSQL* mysql=mysql_init(nullptr);
    mysql=mysql_real_connect(mysql,"localhost","conn","123456","conn",3306,nullptr,0);
    if(mysql==nullptr)
    {
        std::cerr<<"mysql connect error\n";
        return 1;
    }
    if(mysql_query(mysql,"insert into test(name) values('Alice')"))
        std::cerr<<"mysql query error\n";
    else
        std::cout<<"mysql query success\n";
    mysql_close(mysql);
    return 0;
}

没问题。

继续插入:

cpp 复制代码
if(mysql_query(mysql,"insert into test(name) values('张三')"))

也没问题,说明我们的编码格式适配的很好。

那么我们尝试select:

cpp 复制代码
if(mysql_query(mysql,"select * from test"))
        std::cerr<<"mysql query error\n";
    else
        std::cout<<"mysql query success\n";
shell 复制代码
zhangwho@VM-0-2-ubuntu:~/Trainning/2026_1_29$ ./test 
mysql query success

成功是成功了,但是没有什么结果啊!

我们还需要其他接口:

cpp 复制代码
MYSQL_RES *mysql_store_result(MYSQL *mysql);

该函数会调用MYSQL变量中的st_mysql_methods中的 read_rows 函数指针来获取查询的结果。同时该函数会返回MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果。同时该函数malloc了一片内存空间来存储查询过来的数据,所以我们一定要记的 free(result),不然是肯定会造成内存泄漏的。 执行完mysql_store_result以后,其实数据都已经在MYSQL_RES 变量中了,下面的api基本就是读取MYSQL_RES 中的数据。

我们可以看到MYSQL_RES的结构:

此外,还能通过接口直接获取MYSQL_RES的数据:

获取结果行数mysql_num_rows

cpp 复制代码
my_ulonglong mysql_num_rows(MYSQL_RES *res);

获取结果列数mysql_num_fields

cpp 复制代码
unsigned int mysql_num_fields(MYSQL_RES *res);

获取列名mysql_fetch_fields

cpp 复制代码
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);

获取结果内容mysql_fetch_row

cpp 复制代码
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

最后释放MYSQL_RES

cpp 复制代码
void mysql_free_result(MYSQL_RES *result);

那么接下来我们就可以如此操作:

cpp 复制代码
//获取列名
for(int i=0;i<col;i++)
{
    std::cout<<filed[i].name<<'\t';
}
std::cout<<std::endl;
//获取内容
MYSQL_ROW line;
for(int i=0;i<row;i++)
{
    line=mysql_fetch_row(res);
    for(int j=0;j<col;j++)
    {
        std::cout<<line[j]<<'\t';
    }
    std::cout<<std::endl;
}
mysql_free_result(res);

输出:

shell 复制代码
zhangwho@VM-0-2-ubuntu:~/Trainning/2026_1_29$ ./test 
mysql query success
id      name    age
1       Alice   18
2       张三    18

没有问题

workbench

workbench是mysql官网提供的图形化界面

我们可以在win上下载workbench,当然同时要先下载mysql。

如果不想两个分开下载,我们可以下载MySQL Installer

选择下面的安装包,然后:

选择Full即可。

在等待下载的这段时间,我们可以将conn的登录主机改为%:

sql 复制代码
mysql> update user set Host='%' where user='conn';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select host,user,authentication_string from user;
+-----------+------------------+------------------------------------------------------------------------+
| host      | user             | authentication_string                                                  |
+-----------+------------------+------------------------------------------------------------------------+
| %         | conn             | $A$005$o`unF%\r~f~%5
                                                     3Hmgs258v3VDpbsTfYTu4gyTbyCDhGIsJpwUgjKM.k6B8 |
| localhost | mysql.infoschema | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.session    | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | mysql.sys        | $A$005$THISISACOMBINATIONOFINVALIDSALTANDPASSWORDTHATMUSTNEVERBRBEUSED |
| localhost | root             | $A$005$c3OCZ*k@w6s4#r)oD1TOBStybtxtwaEeZ1KfZ9mbVFiR4LD3x/1vxhtrnD |
+-----------+------------------+------------------------------------------------------------------------+
5 rows in set (0.00 sec)

当然这样修改是不足的,还需要对一些权限进行修改。最好就是删除了重新创建用户。

随后我们使用这个账户继续进行测试.

选择+,添加新的连接:

如此我们就能对数据库进行操作:

我们能直接在图形界面写入数据,然后点击右下角的apply

他就会自动写入相应的sql语句。

总之就是这样!

相关推荐
兩尛2 小时前
c++知识点2
开发语言·c++
xiaoye-duck2 小时前
C++ string 底层原理深度解析 + 模拟实现(下)——面试 / 开发都适用
开发语言·c++·stl
BackCatK Chen2 小时前
C语言学习栏目目录
c语言·保姆级教程·c语言入门·c语言学习栏目目录
Azure_withyou3 小时前
Visual Studio中try catch()还未执行,throw后便报错
c++·visual studio
琉染云月3 小时前
【C++入门练习软件推荐】Visual Studio下载与安装(以Visual Studio2026为例)
c++·visual studio
五岳3 小时前
DTS按业务场景批量迁移阿里云MySQL库实战(上):技术选型和API对接
mysql·阿里云·dts
极客数模4 小时前
【2026美赛赛题初步翻译F题】2026_ICM_Problem_F
大数据·c语言·python·数学建模·matlab
L_09074 小时前
【C++】高阶数据结构 -- 红黑树
数据结构·c++
仍然.4 小时前
MYSQL--约束
数据库·mysql