当前位置:首页 > 焦点 > c访问mysql数据库

c访问mysql数据库

2026-10-17 05:44:57 [休闲] 来源:力不从心网

用C写MySQL客户端代码,数据绕不开libmysqlclient这个库。数据装好MySQL服务器之后,数据开发机上通常还得单独装开发包——Ubuntu下是数据libmysqlclient-dev,CentOS上是数据mysql-devel。少了它,数据编译时连mysql.h都找不到。数据

头文件位置有时候挺让人头疼。数据MySQL 8.0之后,数据include路径变成了/usr/include/mysql,数据但某些发行版又给你塞到/usr/local/mysql/include。数据我一般直接mysql_config --cflags看一眼,数据省得瞎猜。数据链接参数同理,数据mysql_config --libs输出什么就用什么,数据别自己硬编-lmysqlclient,版本对不上会出一堆未定义符号。

初始化的套路很固定。先mysql_init()拿到一个MYSQL句柄,然后mysql_real_connect()填主机、用户、密码、库名、端口、socket路径、客户端标志。端口填0就用默认3306,socket填NULL走TCP。有个坑:如果MySQL配了skip-networking,TCP连不上,必须走unix socket,这时候host填localhost,MySQL客户端库会自动切到socket连接。

MYSQL *conn = mysql_init(NULL); if (!mysql_real_connect(conn, "127.0.0.1", "root", "pass", "testdb", 3306, NULL, 0)) {  fprintf(stderr, "%s\n", mysql_error(conn)); return 1; }

连上之后执行SQL就两种方式。mysql_query()适合不需要结果集的语句,比如INSERT、UPDATE。返回值非0就是出错,用mysql_error()拿错误信息。mysql_store_result()和mysql_use_result()用来取SELECT的结果。前者一次性把结果拉到客户端内存,后者逐行从服务器读。数据量小的时候无所谓,几百万行的查询用mysql_use_result()能省不少内存,但注意在读完之前不能在同一连接上发别的查询。

取行用mysql_fetch_row(),返回MYSQL_ROW,本质是char**。所有字段都是字符串形式,哪怕是INT列。想拿数字得自己atoi()或strtol()。字段长度用mysql_fetch_lengths()拿,处理BLOB数据时必须用这个,因为BLOB里可能有\0,直接当C字符串处理会截断。

MYSQL_RES *res = mysql_store_result(conn); MYSQL_ROW row; while ((row = mysql_fetch_row(res))) {  printf("id=%s name=%s\n", row[0], row[1]); } mysql_free_result(res);

预处理语句值得单独说。拼SQL字符串迟早出事,用户名里带个单引号就能把你的查询搞崩。mysql_stmt_init()配合mysql_stmt_prepare()、mysql_stmt_bind_param()是正路。绑定参数用MYSQL_BIND数组,每个元素指定buffer类型、地址、长度。取结果用mysql_stmt_bind_result(),然后循环mysql_stmt_fetch()。代码量比直接拼字符串多不少,但安全性和性能都更好——服务器端能缓存执行计划。

字符集这事经常被忽略。连接建立后最好立刻mysql_set_character_set(conn, "utf8mb4"),不然中文可能变问号。MySQL 8.0默认utf8mb4,但老版本默认latin1,跨版本迁移数据时特别容易踩。

连接池?libmysqlclient本身不提供。自己维护一个MYSQL句柄数组,加锁借还就行。但要注意mysql_ping()检查连接是否还活着,MySQL的wait_timeout默认8小时,闲置太久连接会被服务器掐断。

最后记得mysql_close(conn)。虽然进程退出时操作系统会回收,但长驻服务里不关连接就是泄漏。valgrind跑一下,libmysqlclient在某些版本上会有少量still reachable的内存块,那是库内部的全局初始化,不用管。

(责任编辑:知识)

推荐文章
  • 网站打开后不显示内容

    网站打开后不显示内容 网站打开后不显示内容,十次里有八次是浏览器缓存捣的鬼。上个月我帮朋友排查一个“白屏”问题,他刷新了二十遍,换了三个浏览器,甚至重启了路由器,最后我按F12打开控制台,发现CSS文件加载的是三天前的旧版 ...[详细]
  • 实际操

    实际操 维修手册第47页写着:更换机油滤芯,扭矩25牛·米。我拧了三次,每次都滑丝。 第四次我放弃了扭矩扳手,直接用手感。滤芯外壳是塑料的,拧到某个临界点会突然变涩,再往前半圈就是极限。这个“半圈”没法写进手 ...[详细]
  • 自动增加网站链接

    自动增加网站链接 我在维护公司官网时遇到一个麻烦:每次发布新文章,都得手动去首页、栏目页、相关推荐里各加一次链接。改完三处地方,半小时就没了。更要命的是,漏改一处,用户点进死链,转化率直接掉一个点。 后来我用了一段十几 ...[详细]
  • 内网arp攻击检测工具

    内网arp攻击检测工具 凌晨两点,公司群里炸了锅。运维老张发了一张截图,整个办公网段两百多台机器,ARP表里的网关MAC地址全变成了同一个陌生值——00:0c:29:xx:xx:xx。那台虚拟机的MAC前缀,是VMware的 ...[详细]
  • 虚拟机

    虚拟机 我头一回真正意识到虚拟机这东西有多神奇,是在一台报废的笔记本电脑上。那台机器,硬盘嘎嘎响,风扇转得像直升机,Windows 10跑个浏览器都能卡出幻灯片效果。我实在懒得重装系统,就装了个Virtual ...[详细]
  • 糖果派对娱乐网站

    糖果派对娱乐网站 我盯着屏幕上旋转的糖果符号,第三十七次按下“旋转”按钮。金币哗啦啦掉落的音效里,我的游戏余额从两位数涨到了四位数——然后在下一次旋转中归零。这就是《糖果派对娱乐网站》给我的第一课:赢来的钱,从来不是你 ...[详细]
  • 飞机起飞降落视频高清

    飞机起飞降落视频高清 跑道尽头的灯光一排排亮起,像一条发光的项链铺在夜色里。我站在机场围界外的土坡上,手机镜头对准远处那架正在加速的波音737。引擎声从低沉变成嘶吼,轮胎与地面摩擦发出尖锐的啸叫——那声音穿透胸腔,比任何音 ...[详细]
  • 漏洞挖掘系统

    漏洞挖掘系统 漏洞挖掘系统 凌晨两点,我盯着屏幕上那个闪烁的十六进制地址,手边的咖啡早已凉透。这已经是第七天了,那个藏在Apache模块里的堆溢出漏洞像条滑溜的泥鳅,每次fuzzing测试都在最后一步崩溃,却又总在 ...[详细]
  • 黄队蓝队换个位

    黄队蓝队换个位 黄队和蓝队换了个位。不是球场上的战术调整,是公司年中复盘时,两个项目组被整体调换了负责的业务线。黄队原来做的是老牌产品,客户稳定,流程成熟,像一台运转多年的老钟表。蓝队呢,接的是新孵化项目,需求天天变 ...[详细]
  • usdt网站渗透嶶x咨询53866源码

    usdt网站渗透嶶x咨询53866源码 凌晨三点,我盯着屏幕上那个跳动的光标,手指悬在键盘上没落下去。这不是我第一次接触usdt交易的源码审计,但每次打开这类网站的后台,心里还是会咯噔一下。你问我在找什么?找漏洞,找那些把用户资金池当提款机 ...[详细]
热点阅读