在C语言中连接MySQL数据库服务器,最直接的方式是使用MySQL官方提供的C API(也就是MySQL Connector/C),通过mysql_init初始化和mysql_real_connect建立连接,再用mysql_query执行SQL语句。 这套接口几乎支持所有主流平台,也是目前C项目对接MySQL的事实标准。
mysql c语言连接数据库服务器步骤详解
第一步:安装MySQL开发库
如果你在Ubuntu或Debian上,执行:
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地址,也可以是域名,连本地写或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_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测一下端口通不通,如果服务器在简米云、酷番云等平台,还需要到安全组规则里放行对应端口,业内专家指出,相当一部分远程连接失败案例,都卡在安全组这层。
连接超时与重连
网络环境不稳定时,给客户端设置一个合理的连接超时,避免程序卡死:
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





