MySQL怎么和C连接数据库服务器,连接方法有哪些?

在C语言中连接MySQL数据库服务器,最直接的方式是使用MySQL官方提供的C API(也就是MySQL Connector/C),通过mysql_init初始化和mysql_real_connect建立连接,再用mysql_query执行SQL语句。 这套接口几乎支持所有主流平台,也是目前C项目对接MySQL的事实标准。

mysql c语言连接数据库服务器步骤详解

第一步:安装MySQL开发库

如果你在Ubuntu或Debian上,执行:

C语言开发网站 第七章:C语言连接MySQL
加载中
C语言开发网站 第七章:C语言连接MySQL
sudo apt-get install libmysqlclient-dev

在CentOS或RHEL上,执行:

sudo yum install mysql-devel

macOS上推荐用Homebrew安装:

brew install mysql-client

安装完成后,检查两个关键东西是否存在:一个是头文件mysql.h,另一个是动态库libmysqlclient.so(macOS下是.dylib),用mysql_config --version能打印版本号,就说明开发环境ready了。

第二步:初始化连接句柄

在C代码里写:

#include <mysql.h>
#include <stdio.h>
MYSQL conn;
conn = mysql_init(NULL);
if (conn == NULL) {
    fprintf(stderr, "mysql_init失败: %sn", mysql_error(conn));
    return -1;
}

mysql_init(NULL)会分配并返回一个连接句柄,如果内存不足或初始化失败,返回NULL。

第三步:建立连接

用mysql_real_connect完成握手,函数签名如下:

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 clientflag);

实际调用时,注意参数别传错:

conn = mysql_real_connect(conn, "192.168.1.10", "root", "mypassword",
                          "test_db", 3306, NULL, 0);
if (conn == NULL) {
    fprintf(stderr, "连接失败: %sn", mysql_error(conn));
    return -1;
}
  • host 可以是IP地址,也可以是域名,连本地写

    MySQL怎么和C连接数据库服务器,连接方法有哪些?

    localhost或0.0.1。

  • port 是MySQL服务端口,默认3306。
  • unix_socket 通常传NULL,表示走TCP。
  • clientflag 传0表示默认行为。

第四步:执行SQL并处理结果

执行SQL用mysql_query或mysql_real_query,对于INSERT、UPDATE这类写操作,直接调用:

if (mysql_query(conn, "INSERT INTO users(name) VALUES('Tom')")) {
    fprintf(stderr, "SQL执行错误: %sn", mysql_error(conn));
    return -1;
}

对于SELECT,需要拿到结果集:

MYSQL_RES res;
MYSQL_ROW row;
if (mysql_query(conn, "SELECT id, name FROM users")) {
    fprintf(stderr, "查询失败: %sn", mysql_error(conn));
    return -1;
}
res = mysql_store_result(conn);
while ((row = mysql_fetch_row(res)) != NULL) {
    printf("id=%s, name=%sn", row[0], row[1]);
}
mysql_free_result(res);

mysql_store_result会把所有结果从服务器拉到客户端内存,数据量特别大时,可以改用mysql_use_result逐行读取。

第五步:关闭连接

用完记得释放资源:

mysql_close(conn);
mysql_lib_end();

mysql_close释放连接句柄,mysql_lib_end清理整个客户端库的状态,多数情况下,这两个会在程序退出前成对出现。

c语言连接mysql数据库服务器配置指南

编译链接参数

编译C程序时,最省心的方式是用mysql_config工具拿到编译和链接参数:

gcc -o myapp myapp.c $(mysql_config --cflags) $(mysql_config --libs)

$(mysql_config --cflags)会展开成-I/usr/include/mysql这类头文件路径,$(mysql_config --libs)会展开成-lmysqlclient -lz -lcrypto等需要用到的库,如果你在写Makefile,也照样可以直接嵌入这两个命令。

如果你的系统里没有mysql_config,也可以手动指定:

gcc -o myapp myapp.c -I/usr/include/mysql -L/usr/lib/mysql -lmysqlclient

MySQL怎么和C连接数据库服务器,连接方法有哪些?

但这样容易漏掉一些隐式依赖,还是推荐优先用mysql_config。

处理中文乱码

C程序从MySQL读取数据后中文变成乱码,十有八九是字符集没对齐,连接建立后,立刻执行:

mysql_query(conn, "SET NAMES utf8mb4");

你的数据表、连接参数、C源码文件本身都得是UTF-8编码,MySQL 5.5.3以后支持utf8mb4,行业共识认为这是最稳妥的中文存储方案,因为utf8格式存不了emoji和生僻字。

常见错误排查

  • 找不到mysql.h:说明没装开发包,或者头文件路径未包含。
  • mysql_real_connect返回NULL:用mysql_error(conn)查看具体错误,常见的是网络不通、账号权限不足、密码错误。
  • 编译时报undefined reference to mysql_init:多半是没链接libmysqlclient,检查-lmysqlclient参数。

mysql connector/c连接远程数据库服务器的注意事项

账号权限与主机限制

远程连接MySQL,第一步不是改代码,而是看MySQL账号有没有对应的host权限,默认的root@localhost只能在本地登录,必须创建一个允许远端访问的账号,或者修改host字段为,给一个新账号授权:

CREATE USER 'app_user'@'%' IDENTIFIED BY 'StrongPass123';
GRANT ALL PRIVILEGES ON test_db. TO 'app_user'@'%';
FLUSH PRIVILEGES;

MySQL服务器配置里的bind-address不能是0.0.1,需要绑定到0.0.0或具体网卡地址,否则外部请求根本到达不了MySQL进程。

防火墙与云安全组

远程连不上时,先检查服务器防火墙是否放行了3306端口,用telnet 服务器IP 3306测一下端口通不通,如果服务器在简米云、酷番云等平台,还需要到安全组规则里放行对应端口,业内专家指出,相当一部分远程连接失败案例,都卡在安全组这层。

连接超时与重连

MySQL怎么和C连接数据库服务器,连接方法有哪些?

网络环境不稳定时,给客户端设置一个合理的连接超时,避免程序卡死:

unsigned int timeout = 5;
mysql_options(conn, MYSQL_OPT_CONNECT_TIMEOUT, &timeout);

这个设置要在mysql_real_connect之前调用,生产环境最好再做断线重连,或者使用连接池复用已有连接,而不是每次请求都新开一个。

使用SSL加密连接

MySQL 5.7以上默认支持SSL,如果数据需要走公网传输,建议用mysql_ssl_set启用TLS:

mysql_ssl_set(conn, NULL, NULL, NULL, NULL, NULL);

然后正常执行mysql_real_connect,握手过程会自动升级为SSL加密,至于CA证书,要按服务器配置的具体情况来写。

mysql和c连接数据库服务器常见问题解答

mysql_real_connect失败,报“Access denied”是什么原因?

账号密码错误,或者该账号没有权限从你当前的IP地址登录,先在本机命令行里用同样的用户名和密码测试,确认MySQL层没问题,再检查账号的host字段是否覆盖了客户端IP。

C程序执行SELECT后,怎么区分NULL和空字符串?

mysql_fetch_row返回的字段是char数组,如果字段值为NULL,对应指针是NULL,如果你用的是INSERT插入空字符串,返回的就是空字符串,代码里用if (row[i] == NULL)来判断,不要直接拿strcmp比较,可能踩内存坑。

mysql_config在系统里找不到怎么办?

一种情况是开发库没装,装完就出来了,另一种情况是安装路径不在PATH里,可以手动找一下:

find /usr -name "mysql_config" 2>/dev/null

找到后直接用它的完整路径,或者把它软链到/usr/local/bin下,还可以用pkg-config --cflags --libs mysqlclient作为备选方案。

C语言连接MySQL数据库服务器的核心就三步:装好开发库,编译链接带上mysql_config参数,在代码里按init -> connect -> query -> close的顺序操作,把环境配置捋顺了,整个流程其实非常稳定。

首发原创文章,作者:王坚‌,如若转载,请注明出处:https://idctop.com/mysql%e6%80%8e%e4%b9%88%e5%92%8cc%e8%bf%9e%e6%8e%a5%e6%95%b0%e6%8d%ae%e5%ba%93%e6%9c%8d%e5%8a%a1%e5%99%a8%ef%bc%8c%e8%bf%9e%e6%8e%a5%e6%96%b9%e6%b3%95%e6%9c%89%e5%93%aa%e4%ba%9b%ef%bc%9f/

赞 (0)
为什么cf总是显示服务器人满了,怎么解决?
上一篇 2026年10月2日 15:37
t3不能连接服务器如何解决,故障原因有哪些
下一篇 2026年10月2日 15:39

相关推荐

  • 我的世界pvp材质包怎么加进服务器,服务器材质包怎么安装?

    我的世界PvP材质包加入服务器,核心是把它做成服务端资源包,通过HTTP直链和sha1分发给全服;客户端本地材质包只能自己看到, 如果你想让队友、对手进服后统一低火焰、短剑、透明水,必须走服务端分发,而不是只丢进自己的.minecraft/resourcepacks,我的世界pvp材质包怎么加入服务器里:先分清……

    2026年10月9日
    100
  • 我的世界怎么创建虚拟服务器,需要什么配置

    想在《我的世界》里创造一个虚拟服务器,核心就一句话:租一台有公网IP的云主机,装上面板或服务端,把端口映射出去,你的朋友就能随时连进来,这在2026年已经是最成熟的方案,很多玩家第一次接触“服务器”这个词,脑子里浮现的是机房、机柜、嗡嗡作响的散热风扇,其实在MC的世界里,虚拟服务器没那么玄乎,它就是一台7×24……

    程序编程 2026年10月24日
    000
  • DesiVPS美国VPS便宜吗?美国便宜VPS推荐

    DesiVPS美国便宜VPS套餐低至$15/年,提供1Gbps不限流量带宽及免费DDoS防御,是预算有限且追求高性价比用户的理想选择,在服务器租赁市场鱼龙混杂的今天,寻找一款既便宜又稳定的VPS并非易事,许多用户往往在低价陷阱和高昂维护成本之间徘徊,DesiVPS推出的这款美国套餐,以其极具冲击力的价格策略和硬……

    2026年6月25日
    2000
  • 英雄联盟为什么一直连不上服务器,怎么回事

    lol连接不上服务器,问题通常不在玩家电脑性能,而是官方服务器状态、本地网络解析、客户端组件这三层中的某一环出了差错,多数情况下,先查服务器公告,再清理本地网络缓存,就能恢复连接,为什么lol连接不到服务器?常见原因逐个排查官方服务器维护和区域性宕机拳头游戏的服务器架构分为多个大区,每个大区独立运行,2026年……

    2026年10月2日
    100
  • 服务器cpu运算速度如何提升?服务器cpu性能优化方法

    服务器CPU的运算速度直接决定了业务系统的处理能力上限与响应效率,是衡量服务器性能最核心的指标,在数字化转型加速的今天,无论是数据库查询、高并发Web服务,还是人工智能模型训练,其最终表现都受制于CPU的数据吞吐与计算能力,核心结论在于:服务器CPU运算速度并非单一的主频数值,而是由核心数量、缓存架构、指令集优……

    2026年4月11日
    7400
  • 如何构筑云原生安全技术底座?云原生安全有哪些核心挑战

    构筑云原生安全技术底座的本质,是将安全能力左移至开发阶段,并通过自动化策略实现“代码即基础设施,策略即代码”的持续合规与防护,过去我们习惯在应用上线前做一次“体检”,现在这种模式已经失效,云原生环境变化太快,静态扫描根本追不上部署节奏,真正的安全底座,不是外挂的防火墙,而是长在容器、Kubernetes和微服务……

    2026年5月26日
    3600
  • 两台NFS服务器如何实现高可用,NFS高可用集群怎么搭建?

    两台NFS服务器做高可用,最落地的做法是DRBD+Keepalived实现块设备镜像与浮动IP自动切换,或者共享存储+Pacemaker做资源接管;核心是数据同步、故障检测和客户端无感重连,两台NFS服务器高可用方案怎么选:DRBD+Keepalived与共享存储对比为什么NFS高可用比Web服务更麻烦NFS不……

    2026年10月5日
    100
  • IBM中间件和服务器咋区分?,二者有什么区别?

    IBM中间件和服务器怎么区分?核心答案其实很简单:中间件是跑在服务器上的软件层,服务器是承载它的物理设备,两者是”房子”和”住户”的关系,很多人把IBM的WebSphere、MQ这些产品和Power系列小型机混为一谈,原因在于IBM的产品命名实在太有迷惑性——WebSphere Application Serv……

    程序编程 2026年10月31日
    100
  • AIoT走进现实生活,AIoT技术如何改变我们的日常生活?

    AIoT(人工智能物联网)已不再是停留在概念阶段的未来技术,而是切实改变社会运转逻辑的核心驱动力,AIoT走进现实生活的最核心价值在于:它通过“端-边-云”的协同计算,实现了物理世界与数字世界的精准映射与智能反馈,从而大幅提升了资源配置效率与人类生活质量,这不仅是技术的迭代,更是生活方式的彻底革新, 智能家居……

    2026年3月11日
    13100
  • 笔记本电脑打cf服务器异常怎么办?,怎么解决

    CF提示“服务器异常”时,绝大多数情况不是你运气差,而是笔记本本地网络或系统环境出了问题,按顺序排查网络链路、系统设置和游戏文件,基本都能找到原因并解决,先分清“服务器异常”是官方问题还是你的问题打开游戏突然弹窗“服务器连接失败”,先别急着重装系统,你得确认问题出在谁身上,不然折腾半天白费力气,判断官方服务器是……

    2026年8月11日
    2300

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注