使用C语言连接MySQL

1.准备工作

1.1 安装mysql

在centos7中安装mysql8.0

1.保证mysql服务有效

bash 复制代码
sudo yum install -y mysql-community-server

2.下载合适自己平台的mysql connect库

bash 复制代码
sudo yum install -y mysql-community-devel

1.2 配置编译配置

包含头文件 和链接

头文件在系统中,不需显示包含。

Makefile:

2.MySQL接口使用

官方文档:MySQL :: MySQL 8.4 C API Developer Guide :: 4 C API Function Reference

2.0 查询版本

cpp 复制代码
const char * mysql_get_client_info(void)

2.1 初始化MYSQL对象

cpp 复制代码
MYSQL * mysql_init(MYSQL *mysql)

2.2 连接数据库

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_socket,
                    unsigned long client_flag)

2.3 设置编码方式

cpp 复制代码
int mysql_set_character_set(MYSQL *mysql, const char *csname)

2.4 执行SQL语句

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

2.5 获取查询结果

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

1.获取结果行数

cpp 复制代码
uint64_t mysql_num_rows(MYSQL_RES *result)

2.获取结果列数

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

3.获取结果列名

cpp 复制代码
MYSQL_FIELD * mysql_fetch_field(MYSQL_RES *result)

4.获取结果内容

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

2.6 关闭连接

cpp 复制代码
void mysql_close(MYSQL *mysql)

2.7 *事务相关

cpp 复制代码
bool mysql_autocommit(MYSQL *mysql, bool mode)
bool mysql_commit(MYSQL *mysql)
bool mysql_rollback(MYSQL *mysql)

3 案例

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

const std::string host = "localhost";
const std::string user = "lmx";
const std::string password = "0506";
const std::string db = "conn";
const unsigned int port = 3306;

int main()
{
    //查看版本号
    std::cout << "mysql client Version:" << mysql_get_client_info() << std::endl;
    //初始化MYSQL对象
    MYSQL *mysql = mysql_init(nullptr);
    if (mysql == nullptr)
    {
        std::cerr << "init MySQL error" << std::endl;
        return 1;
    }
    //建立连接
    if (mysql_real_connect(mysql, host.c_str(), user.c_str(), password.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        std::cout << "connect MySQL error" << std::endl;
        return 2;
    }
    //设置编码方式
    if(mysql_set_character_set(mysql, "utf8") != 0)
    {
        std::cout << "set character error" << std::endl;
        return 3;
    }

    // const std::string sql = "insert into user (name, age, telphone) values('阿哒', 25, '14455')";
    // const std::string sql = "update user set age = 18 where id = 1";
    // const std::string sql = "delete from user where id = 3";
    // const std::string sql = "select * from user";

    while (true)
    {
        std::string sql;
        std::cout << "MySQL<< ";
        if (!(std::getline(std::cin, sql)) || sql == "quit")
        {
            std::cout << "byebye" << std::endl;
            break;
        }
        //执行查询
        if (mysql_query(mysql, sql.c_str()) == 0)
        {
            std::cout << "success" << std::endl;
        }
        else
        {
            std::cerr << "failed" << std::endl;
            return 4;
        }
        //捕获结果
        if (sql.find("select") != std::string::npos)
        {
            MYSQL_RES *result = mysql_store_result(mysql);
            if(result == nullptr)
            {
                std::cerr << "store result error" << std::endl;
                return 5;
            }
            //行数
            uint64_t rows = mysql_num_rows(result);
            //列数
            unsigned int fields = mysql_num_fields(result);
            //列属性[array]
            MYSQL_FIELD *field = mysql_fetch_field(result);
            // 属性
            for (int i = 0; i < fields; i++)
            {
                std::cout << field[i].name << "\t";
            }
            std::cout << std::endl;
            // 内容
            for (int i = 0; i < rows; i++)
            {
                //行内容
                MYSQL_ROW row = mysql_fetch_row(result);
                for (int j = 0; j < fields; j++)
                {
                    std::cout << row[j] << "\t";
                }
                std::cout << std::endl;
            }
        }
    }
    mysql_close(mysql);
    return 0;
}
相关推荐
数据组小组15 小时前
免费数据库管理工具深度横评:NineData 社区版、Bytebase 社区版、Archery,2026 年开发者该选哪个?
数据库·测试·数据库管理工具·数据复制·迁移工具·ninedata社区版·naivicat平替
用户83071968408220 小时前
MySQL 查询优化 30 条封神技巧:用好索引,少耗资源,查询快到飞起
mysql
Nyarlathotep01131 天前
事务隔离级别
sql·mysql
悟空聊架构1 天前
基于KaiwuDB在游乐场“刷卡+投币”双模消费系统中的落地实践
数据库·后端·架构
IvorySQL1 天前
PostgreSQL 技术日报 (3月4日)|硬核干货 + 内核暗流一网打尽
数据库·postgresql·开源
樱木Plus1 天前
深拷贝(Deep Copy)和浅拷贝(Shallow Copy)
c++
Nyarlathotep01131 天前
SQL的事务控制
sql·mysql
进击的丸子1 天前
虹软人脸服务器版SDK(Linux/ARM Pro)多线程调用及性能优化
linux·数据库·后端
用户86178277365181 天前
MySQL 8.0从库宕机排查实录:中继日志膨胀引发的连锁故障复盘
mysql
NineData2 天前
NineData智能数据管理平台新功能发布|2026年1-2月
数据库·sql·数据分析