【MySQL】利用C语言连接数据库

[复制链接]
发表于 2025-6-28 19:52:32 | 显示全部楼层 |阅读模式
目录

一、准备工作
二、数据表操作
(一)初始化数据库
(二)连接数据库
(三)设置字符集
(四)操作数据表
1、插入数据
2、删除数据
3、更新数据
4、查询数据


一、准备工作

        在之前的文章中都是利用 MySQL 客户端以下令行的形式举行数据库操作,但在现实开发中是以语言级别的形式对数据库举行操作。
        首先需要创建一个用户以供操作,用户管理详见:【MySQL】视图与用户管理-CSDN博客
        其次还需要准备一个测试表:
  1. mysql> create table person(
  2.     -> id int primary key auto_increment,
  3.     -> name varchar(20) not null,
  4.     -> age int not null,
  5.     -> telephone varchar(20) unique);
  6. Query OK, 0 rows affected (0.02 sec)
  7. mysql> insert into person values(1,'张三',18,'123456'), (2,'李四',20,'123789');
  8. Query OK, 2 rows affected (0.01 sec)
  9. Records: 2  Duplicates: 0  Warnings: 0
  10. mysql> select * from person;
  11. +----+--------+-----+-----------+
  12. | id | name   | age | telephone |
  13. +----+--------+-----+-----------+
  14. |  1 | 张三   |  18 | 123456    |
  15. |  2 | 李四   |  20 | 123789    |
  16. +----+--------+-----+-----------+
  17. 2 rows in set (0.00 sec)
复制代码
        接下来需要配置环境,只要正常下载了 MySQL,它会自动把相关的库也会给配置好,在利用时需要配置好项目标环境以及包含好相应的头文件即可。以下是用于验证代码环境是否配置成功:
  1. # 下载并安装 MySQL 仓库配置
  2. sudo dnf install https://dev.mysql.com/get/mysql80-community-release-el8-1.noarch.rpm
  3. # 更新仓库缓存
  4. sudo dnf update
  5. # 安装 MySQL 开发包(包含头文件和链接库)
  6. sudo dnf install mysql-devel
  7. # 若GBK报错
  8. sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022
  9. sudo dnf clean all
  10. # 若无效
  11. sudo dnf install mysql-community-devel --nogpgcheck
  12. # 查看头文件路径(关键用于 C 编译)
  13. ls /usr/include/mysql    //若输出包含 mysql.h 等头文件,则安装成功
复制代码
        当配置优劣境以后,我们就可以利用 MySQL 提供的 API 举行编程了。
  1. #include <iostream>
  2. #include <mysql.h>
  3. using namespace std;
  4. int main()
  5. {
  6.     printf("mysql client Version: %s\n", mysql_get_client_info());
  7.     return 0;
  8. }
复制代码
        在编译连接时需要指明 MySQL 头文件以及库文件,以下是makefile文件:
  1. mysql:mysql.cpp
  2.         g++ -o $@ $^ -std=c++11 -I/usr/include/mysql -L/usr/lib64/mysql -lmysqlclient
  3. .PHONY:clean
  4. clean:
  5.         rm -rf mysql
复制代码
二、数据表操作

(一)初始化数据库

  1. //初始化数据库
  2. MYSQL *mysql_init(MYSQL *mysql);
复制代码
  作用:初始化数据库,连接数据库前的必要条件;
  参数:若传入NULL,则会新建并初始化一个MySQL对象;
             若传入已有的MySQL指针,则会重置该指向的对象;
  返回值:成功返回初始化后的对象,失败返回NULL。
  (二)连接数据库

        想对数据库举行操作,必须先举行初始化,之后再需要连接数据库。
  1. //连接数据库
  2. MYSQL *mysql_real_connect(
  3.     MYSQL *mysql,           // 已初始化的 MYSQL 结构体指针
  4.     const char *host,       // 服务器主机名或 IP 地址
  5.     const char *user,       // 登录用户名
  6.     const char *passwd,     // 登录密码
  7.     const char *db,         // 默认数据库名
  8.     unsigned int port,      // TCP/IP 端口号(0 表示默认 3306)
  9.     const char *unix_socket,// Unix 套接字路径(NULL 表示不使用)
  10.     unsigned long client_flag //客户端标志位(通常为 0)
  11. );
复制代码
  作用:连接数据库;
  参数:各个字段意义已在代码中解释;
  返回值:成功返回传入的 MySQL 指针,失败返回NULL。
          案例:
  1. #include <iostream>
  2. #include <string>
  3. #include <mysql.h>
  4. using namespace std;
  5. const string host = "127.0.0.1";
  6. const string user = "X";
  7. const string passwd = "Mht1412.";
  8. const string db_name = "test";
  9. int main()
  10. {
  11.     MYSQL *mysql = mysql_init(nullptr);
  12.     if (!mysql)
  13.     {
  14.         cerr << "初始化失败" << endl;
  15.         return 1;
  16.     }
  17.     if (!mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db_name.c_str(), 3306, nullptr, 0))
  18.     {
  19.         cerr << "数据库连接失败" << endl;
  20.         return 2;
  21.     }
  22.     cout << "数据库连接成功" << endl;
  23.     mysql_close(mysql); // 关闭MySQL
  24.     return 0;
  25. }
复制代码
(三)设置字符集

        连接数据库成功后,已经可以正常对表举行操作,但是获取中文会是乱码。这是因为原始默认的字符集时 latin1, 需要设置为 utf8。
  1. //设置字符集
  2. mysql_set_character_set(myfd, "utf8");
复制代码
(四)操作数据表

        对数据表举行操作利用的是同一个接口,只是传入差别的参数从而到达差别的效果:
  1. int mysql_query(MYSQL *mysql, const char *q);
复制代码
  作用:操作数据表;
  参数:指针mysql 为初始化生成的mysql指针,也就是数据库句柄;
              q 为传入的 MySQL 语句。
  返回值:成功返回0,失败返回非0。
  1、插入数据

  1. #include <iostream>
  2. #include <string>
  3. #include <mysql.h>
  4. using namespace std;
  5. const string host = "127.0.0.1";
  6. const string user = "X";
  7. const string passwd = "Mht1412.";
  8. const string db_name = "test";
  9. int main()
  10. {
  11.     MYSQL *mysql = mysql_init(nullptr);
  12.     if (!mysql)
  13.     {
  14.         cerr << "初始化失败" << endl;
  15.         return 1;
  16.     }
  17.     if (!mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db_name.c_str(), 3306, nullptr, 0))
  18.     {
  19.         cerr << "数据库连接失败" << endl;
  20.         return 2;
  21.     }
  22.     cout << "数据库连接成功" << endl;
  23.     string sql = "insert into person values (3, '王五', 19, 456789)";
  24.     if (mysql_query(mysql, sql.c_str()))
  25.     {
  26.         cerr << "数据库操作失败" << endl;
  27.         return 3;
  28.     }
  29.     cout << "数据库操作成功" << endl;
  30.     mysql_close(mysql); // 关闭MySQL
  31.     return 0;
  32. }
复制代码
         运行效果:

2、删除数据

  1. #include <iostream>
  2. #include <string>
  3. #include <mysql.h>
  4. using namespace std;
  5. const string host = "127.0.0.1";
  6. const string user = "X";
  7. const string passwd = "Mht1412.";
  8. const string db_name = "test";
  9. int main()
  10. {
  11.     MYSQL *mysql = mysql_init(nullptr);
  12.     if (!mysql)
  13.     {
  14.         cerr << "初始化失败" << endl;
  15.         return 1;
  16.     }
  17.     if (!mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db_name.c_str(), 3306, nullptr, 0))
  18.     {
  19.         cerr << "数据库连接失败" << endl;
  20.         return 2;
  21.     }
  22.     cout << "数据库连接成功" << endl;
  23.     string sql = "delete from person where id = 3";
  24.     if (mysql_query(mysql, sql.c_str()))
  25.     {
  26.         cerr << "数据库操作失败" << endl;
  27.         return 3;
  28.     }
  29.     cout << "数据库操作成功" << endl;
  30.     mysql_close(mysql); // 关闭MySQL
  31.     return 0;
  32. }
复制代码
        运行效果:

3、更新数据

  1. #include <iostream>
  2. #include <string>
  3. #include <mysql.h>
  4. using namespace std;
  5. const string host = "127.0.0.1";
  6. const string user = "X";
  7. const string passwd = "Mht1412.";
  8. const string db_name = "test";
  9. int main()
  10. {
  11.     MYSQL *mysql = mysql_init(nullptr);
  12.     if (!mysql)
  13.     {
  14.         cerr << "初始化失败" << endl;
  15.         return 1;
  16.     }
  17.     if (!mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db_name.c_str(), 3306, nullptr, 0))
  18.     {
  19.         cerr << "数据库连接失败" << endl;
  20.         return 2;
  21.     }
  22.     cout << "数据库连接成功" << endl;
  23.     string sql = "update person set name='王五' where name='张三'";
  24.     if (mysql_query(mysql, sql.c_str()))
  25.     {
  26.         cerr << "数据库操作失败" << endl;
  27.         return 3;
  28.     }
  29.     cout << "数据库操作成功" << endl;
  30.     mysql_close(mysql); // 关闭MySQL
  31.     return 0;
  32. }
复制代码
        运行效果:

4、查询数据

        差别于插入、删除与更新操作,查询数据实行成功后是需要显示数据的,因此需要获取查询效果。
  1. //获取查询结果
  2. MYSQL_RES *mysql_store_result(MYSQL *mysql);
  3. //获取查询结果列名
  4. MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);、
  5. //获取查询结果行数
  6. unsigned int mysql_num_rows(MYSQL_RES *res);
  7. //获取查询结果列数
  8. unsigned int mysql_num_fields(MYSQL_RES *res);
  9. //获取结果内容
  10. MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
  11. //释放存储结果
  12. void mysql_free_result((MYSQL_RES *result);
复制代码
        其中 MYSQL_RES 布局体在利用层面上可以简朴理解为二维数组, MYSQL_ROW 是记载数据表中一行的数据,可以简朴理解为迭代器在整个返回的数据内容中举行遍历。
  1. #include <iostream>
  2. #include <string>
  3. #include <mysql.h>
  4. using namespace std;
  5. const string host = "127.0.0.1";
  6. const string user = "X";
  7. const string passwd = "Mht1412.";
  8. const string db_name = "test";
  9. int main()
  10. {
  11.     MYSQL *mysql = mysql_init(nullptr);
  12.     if (!mysql)
  13.     {
  14.         cerr << "初始化失败" << endl;
  15.         return 1;
  16.     }
  17.     if (!mysql_real_connect(mysql, host.c_str(), user.c_str(), passwd.c_str(), db_name.c_str(), 3306, nullptr, 0))
  18.     {
  19.         cerr << "数据库连接失败" << endl;
  20.         return 2;
  21.     }
  22.     cout << "数据库连接成功" << endl;
  23.     string sql = "select * from person";
  24.     if (mysql_query(mysql, sql.c_str()))
  25.     {
  26.         cerr << "数据库操作失败" << endl;
  27.         return 3;
  28.     }
  29.     cout << "数据库操作成功" << endl;
  30.     // 获取查询结果
  31.     MYSQL_RES *res = mysql_store_result(mysql);
  32.     // 获取查询结果行列数
  33.     unsigned int rows = mysql_num_rows(res);
  34.     unsigned int fields = mysql_num_fields(res);
  35.     // 获取查询结果列名
  36.     MYSQL_FIELD *fifld = mysql_fetch_fields(res);
  37.     for (int i = 0; i < fields; ++i)
  38.     {
  39.         cout << fifld[i].name << "\t";
  40.     }
  41.     cout << endl;
  42.     for (int i = 0; i < rows; ++i)
  43.     {
  44.         // 依次获取查询结果中行信息
  45.         MYSQL_ROW row = mysql_fetch_row(res);
  46.         for (int j = 0; j < fields; ++j)
  47.         {
  48.             cout << row[j] << "\t";
  49.         }
  50.         cout << endl;
  51.     }
  52.     // 释放查询结果
  53.     mysql_free_result(res);
  54.     mysql_close(mysql); // 关闭MySQL
  55.     return 0;
  56. }
复制代码
        运行效果:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
继续阅读请点击广告

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

×
登录参与点评抽奖,加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表