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/article/701455.html

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

相关推荐

  • 电脑端网易版我的世界怎么进基岩版服务器?,进不去咋办?

    电脑端网易版MC无法直接进入基岩版服务器,因为网易版国服主程序本质是基于Java版二次开发的客户端,与基岩版的服务器协议从根本上不互通,想玩基岩版服务器,需要更换启动器或借用跨端插件方案,为什么网易版连不上基岩版服务器——版本墙的由来网易版我的世界电脑端上线以来,一直被不少玩家误认为和手机版同一个版本,网易电脑……

    2026年9月24日
    000
  • 服务器300g硬盘够用吗,服务器300g硬盘容量选择指南

    对于绝大多数中小型企业网站、轻量级应用服务器以及冷数据存储场景而言,服务器300g硬盘目前是性价比极高的“黄金容量”选择,它完美平衡了采购成本、存储密度与运维能耗,是构建高可用、低成本IT基础设施的理想组件,与其盲目追求大容量,不如根据实际I/O需求与数据增长曲线,选择最适合的300GB规格,从而实现资源利用率……

    2026年4月6日
    9400
  • ASP网站开发一般用什么数据库?ASP常用数据库选择指南

    ASP一般使用什么数据库?ASP(Active Server Pages)开发中,Microsoft SQL Server 是首选且最广泛使用的数据库管理系统(DBMS),这源于其与微软技术栈(如.NET Framework、IIS)的无缝集成、高性能、强大的企业级功能以及丰富的开发工具支持,ASP的灵活性也允……

    2026年2月7日
    14100
  • go服务器玩游戏没声音咋办,怎么彻底解决?

    先分清是Go程序问题还是服务器环境问题Go服务器玩游戏没声音,核心原因几乎都出在服务器自身的音频环境上,而不是Go代码逻辑有误, 绝大多数Go游戏服务器运行在Linux系统上,默认不带桌面环境、声卡驱动和音频服务,程序就算生成了声音数据也无处播放,要解决问题,得先摸清声音在服务器上的完整链路:音频设备→内核驱动……

    2026年9月24日
    100
  • 无线网dns服务器不可用怎么办,如何修复dns错误?

    当电脑提示“无线网DNS服务器不可用”时,先别急着重装系统,绝大多数情况是你自己的路由器、网卡设置或运营商DNS出了小问题,按顺序排查修复,十分钟内基本都能解决,先搞懂DNS服务器不可用到底卡在哪一环Wi-Fi连上了但打不开网页,右下角网络图标带个黄色感叹号,微信能发但浏览器转圈圈,这种“半通不通”的状态就是典……

    2026年8月30日
    800
  • xp我的世界服务器闪退怎么解决?,为什么闪退?

    XP系统运行我的世界服务器闪退,根源在于Java环境与系统内存管理不兼容,解决方向锁定在更换Java 8最终版、调低内存分配、换用老版本服务端核心这三步,xp系统我的世界闪退怎么解决很多还在用XP系统的玩家会遇到一个奇怪现象:游戏单人模式一切正常,一旦启动服务器马上闪退,这背后是XP系统与新版我的世界服务端之间……

    2026年9月24日
    000
  • CF账号为什么连接不上服务器?,连接失败解决方法有哪些

    CF账号连接不上服务器失败,核心解决思路是依次排查本地网络、游戏运行环境和账号状态,其中九成以上情况可通过修复DNS缓存、关闭加速器冲突或重置网络配置解决,如果你正在玩《穿越火线》时突然提示“连接服务器失败”,别急着砸键盘,这个问题在CF玩家中出现的频率相当高,尤其集中在版本更新后、跨区登录或网络波动时段,下面……

    2026年8月30日
    700
  • 补货VPS测评,CN2 GIA实测,35.42美元/年方案性能数据,VPS测评哪家强,vps测评

    2026年CN2 GIA线路VPS补货首选方案中,35.42美元/年套餐凭借低延迟、高稳定性及极高的性价比,成为国内用户搭建轻量级应用与科学上网的标杆选择,实测综合性能评分达92分,优于同价位90%竞品,在2026年的网络基础设施环境中,CN2 GIA(China Netcom Global Internet……

    2026年5月14日
    5500
  • LOL连接服务器未响应怎么办,英雄联盟进不去游戏如何解决?

    遇到《英雄联盟》连接服务器未响应,最直接有效的办法是先重启游戏和路由器,再用TGP/WeGame自带的网络诊断与修复工具进行一键修复,绝大多数情况都能解决;如果无效,再按本文顺序排查后台程序、DNS和加速器,为什么你的LOL客户端会卡在连接服务器这一步?很多玩家在登录游戏或对局加载时遇到“连接服务器未响应”的弹……

    2026年8月28日
    1100
  • 如何在Web服务器下创建目录,网站根目录文件夹怎么创建?

    在Web服务器下建立目录,核心是先在操作系统文件系统中创建目标文件夹并设置正确权限,再通过服务器配置或控制面板把该目录映射为可访问路径, 无论你用Linux、Windows、宝塔面板还是云服务器,这个逻辑都不会变,先搞懂:Web服务器目录和普通文件夹的区别很多新手以为在服务器上右键新建文件夹,网站就能访问,其实……

    2026年9月28日
    000

发表回复

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