当前位置:首页 > 问答 > 正文

C语言怎么搞定MySQL数据库服务器连接和操作那些事儿,边学边用边调试

准备工作——把桥搭好

你想用C语言去MySQL里取东西或者存东西,首先得有一座桥,这座桥就是MySQL提供的一个叫 MySQL C Connector 的东西(来源:MySQL官方文档),你得先去MySQL官网把这个连接器下载下来并安装好,安装完后,你会得到一些重要的东西:

  1. 头文件:主要是 mysql.h,这个文件里声明了所有我们要用的函数和结构体,就像一本操作手册的目录。
  2. 库文件libmysql.lib(Windows下)或 libmysqlclient.a(Linux下),这是真正的桥梁本体,里面是编译好的代码。

在你的C程序里,一开始就要 #include 把这个头文件引进来,编译程序的时候,还得告诉编译器:“喂,去哪个地方找那个库文件链接一下”,比如用GCC编译的话,命令大概长这样: gcc your_program.c -o your_program -I/头文件路径 -L/库文件路径 -lmysqlclient 这个 -lmysqlclient 就是链接那个库,刚开始环境配置可能会卡一下,搞定了就一马平川了。

第二部分:连接数据库——打个招呼

准备工作做完,就可以开始写代码了,第一步肯定是连接上数据库服务器,这个过程跟咱们找人办事先敲门差不多。

C语言怎么搞定MySQL数据库服务器连接和操作那些事儿,边学边用边调试

  1. 弄一个连接句柄:这相当于一张通行证,用 MYSQL *mysql = mysql_init(NULL); 这句话,系统就会给你分配一个通行证。

  2. 用句柄去真实连接:光有通行证不行,得去敲门,用 mysql_real_connect 这个函数,你要告诉它一大堆信息:

    • 你的连接句柄(就是刚才那个通行证)。
    • 数据库服务器的地址("localhost" 就是本机)。
    • 用户名("root")。
    • 密码。
    • 数据库名(你一上来想用哪个数据库)。
    • 端口号(一般是3306)。

    代码写出来类似这样:

    if (!mysql_real_connect(mysql, "localhost", "root", "your_password", "test_db", 3306, NULL, 0)) {
        fprintf(stderr, "连接失败啦:%s\n", mysql_error(mysql));
        mysql_close(mysql);
        exit(1);
    } else {
        printf("恭喜,数据库连接成功!\n");
    }

    这里有个关键,一定要检查连接成功没有。mysql_real_connect 返回NULL就说明失败,我们可以用 mysql_error(mysql) 看看失败原因是什么,这点在调试时超级重要!

    C语言怎么搞定MySQL数据库服务器连接和操作那些事儿,边学边用边调试

第三部分:执行SQL语句——办正事

连接成功之后,你就可以为所欲为了(在权限范围内),核心就是用一个函数:mysql_query

这个函数很简单,你给它连接句柄和一条SQL语句的字符串,它就去执行。

  • 查询数据(SELECT)

    C语言怎么搞定MySQL数据库服务器连接和操作那些事儿,边学边用边调试

    if (mysql_query(mysql, "SELECT id, name FROM users")) {
        // 处理错误
    } else {
        // 获取结果集
        MYSQL_RES *result = mysql_store_result(mysql);
        if (result == NULL) {
            // 可能没结果或出错了
        } else {
            // 获取有多少个字段(列)
            int num_fields = mysql_num_fields(result);
            // 一行一行地取数据
            MYSQL_ROW row;
            while ((row = mysql_fetch_row(result))) {
                // row是一个字符串数组,即使你数据库里是数字,这里也是字符串形式
                printf("ID: %s, Name: %s\n", row[0], row[1]);
            }
            // 非常重要!用完的结果集一定要释放,不然内存泄漏
            mysql_free_result(result);
        }
    }

    这里的关键是理解 MYSQL_RESMYSQL_ROWRES 代表整个查询结果,像一张临时表。ROW 代表其中的一行,用 mysql_fetch_row 能一行行往下读,读完了它会返回NULL。

  • 增删改数据(INSERT, UPDATE, DELETE): 这些操作更简单,因为它们不返回数据表,只返回成功与否。

    if (mysql_query(mysql, "INSERT INTO users (name) VALUES ('小王')")) {
        fprintf(stderr, "插入失败:%s\n", mysql_error(mysql));
    } else {
        printf("插入成功,影响了 %lld 行数据\n", mysql_affected_rows(mysql));
    }

    mysql_affected_rows 可以知道这条语句影响了多少行数据,比如插入了1行,或者删除了3行。

第四部分:调试和常见坑点——边学边用边调试

光写不调试等于瞎胡闹,以下几点能帮你快速排错:

  1. 错误信息是你的好朋友:任何时候调用MySQL函数失败,立刻用 mysql_error(mysql) 打印错误信息,90%的问题看它就能明白,比如密码错了、表不存在、SQL语法写错了等等。
  2. 记得关门!:就像你开了门要记得关一样,程序结束前一定要用 mysql_close(mysql) 关闭连接,释放资源,结果集用完后也要 mysql_free_result
  3. 字符串陷阱:C语言里字符串很麻烦,如果你的SQL语句里要拼接变量,尤其是用户输入的,千万不能直接 sprintf 拼进去,那有SQL注入攻击的巨大风险,应该使用MySQL的预处理语句(mysql_stmt_init 等系列函数),这个稍微复杂点,但为了安全必须学。
  4. 检查返回值:几乎所有的MySQL函数都有返回值,告诉你成功还是失败,别偷懒,每个都检查一下,不然出了问题你都不知道在哪一步。

流程就是:准备环境 -> 连接数据库 -> 执行SQL -> 处理结果 -> 关闭连接,你找个最简单的数据库,建个表,然后对照着这个流程敲一遍代码,遇到错误就打印信息看看,搞通一遍之后,你会发现也就那么回事儿,剩下的就是多练习,熟悉各种SQL语句和对应的结果处理方式。