c访问mysql数据库
用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表里的网关MAC地址全变成了同一个陌生值——00:0c:29:xx:xx:xx。那台虚拟机的MAC前缀,是VMware的
...[详细]
-
我头一回真正意识到虚拟机这东西有多神奇,是在一台报废的笔记本电脑上。那台机器,硬盘嘎嘎响,风扇转得像直升机,Windows 10跑个浏览器都能卡出幻灯片效果。我实在懒得重装系统,就装了个Virtual
...[详细]
-
我盯着屏幕上旋转的糖果符号,第三十七次按下“旋转”按钮。金币哗啦啦掉落的音效里,我的游戏余额从两位数涨到了四位数——然后在下一次旋转中归零。这就是《糖果派对娱乐网站》给我的第一课:赢来的钱,从来不是你
...[详细]
-
跑道尽头的灯光一排排亮起,像一条发光的项链铺在夜色里。我站在机场围界外的土坡上,手机镜头对准远处那架正在加速的波音737。引擎声从低沉变成嘶吼,轮胎与地面摩擦发出尖锐的啸叫——那声音穿透胸腔,比任何音
...[详细]
-
漏洞挖掘系统 凌晨两点,我盯着屏幕上那个闪烁的十六进制地址,手边的咖啡早已凉透。这已经是第七天了,那个藏在Apache模块里的堆溢出漏洞像条滑溜的泥鳅,每次fuzzing测试都在最后一步崩溃,却又总在
...[详细]
-
黄队和蓝队换了个位。不是球场上的战术调整,是公司年中复盘时,两个项目组被整体调换了负责的业务线。黄队原来做的是老牌产品,客户稳定,流程成熟,像一台运转多年的老钟表。蓝队呢,接的是新孵化项目,需求天天变
...[详细]
-
凌晨三点,我盯着屏幕上那个跳动的光标,手指悬在键盘上没落下去。这不是我第一次接触usdt交易的源码审计,但每次打开这类网站的后台,心里还是会咯噔一下。你问我在找什么?找漏洞,找那些把用户资金池当提款机
...[详细]

渗透漏扫
中国跨境二手车电商
抖音月付可以套现吗
魔兽世界webox小白盒
渗透介绍
