使用mysqlclient需正确配置平台依赖库并规范api调用:windows需mysql connector/c的libmysql.lib和dll,linux/macos装对应开发包;必须调mysql_init()、mysql_real_connect()后检查mysql_error();select用mysql_store_result()获取结果集,dml用mysql_affected_rows();注意null字段判空、字符集设置及资源释放顺序。

用 mysqlclient 连 MySQL 前必须装对库
Windows 下直接用 mysql.h 会报 LNK2019: unresolved external symbol _mysql_init@4,不是代码写错了,是根本没连上 MySQL 的 C API 库。Linux/macOS 也一样,头文件和链接库得配齐。
- Linux:装
libmysqlclient-dev(Debian/Ubuntu)或mysql-devel(CentOS/RHEL),不只是mysql-client - Windows:用官方 MySQL Connector/C,解压后把
include加进编译器头路径,lib下的libmysql.lib(不是 DLL)加进链接器输入,运行时还得把libmysql.dll放到可执行目录或 PATH 里 - macOS:用
brew install mysql-client,但注意mysql_config输出的路径可能不含-lmysqlclient,得手动补上
mysql_real_connect() 返回 NULL 就别往下走了
它不抛异常,只返回 NULL,而且错误信息藏在 mysql_error() 里。很多人只检查指针是否为空,却忽略具体错在哪——连不上、密码错、用户没权限、数据库不存在,全挤在同一个 NULL 里。
- 每次调用
mysql_real_connect()后立刻查if (!conn) { fprintf(stderr, "%s\n", mysql_error(conn)); } - 常见陷阱:
host参数传"localhost"在 Unix 系统下会走 socket 连接,但 MySQL 可能只监听 TCP;换成"127.0.0.1"强制走 TCP,问题常就消失了 -
mysql_init(NULL)必须调用,且不能传栈变量地址——MYSQL conn;然后mysql_init(&conn)是未定义行为
查询结果要用 mysql_store_result() 拿,别直接 mysql_fetch_row()
新手常以为 mysql_query() 执行完就能马上取数据,其实它只是发请求,真正拉回结果集要靠 mysql_store_result() 或 mysql_use_result()。前者把整张结果表缓存在客户端内存,后者边拉边读(适合大结果但要求立刻处理)。
- 执行
SELECT后必须调mysql_store_result(),否则mysql_fetch_row()返回NULL且无提示 -
INSERT/UPDATE/DELETE不产生结果集,不能用mysql_store_result(),该用mysql_affected_rows()查影响行数 - 忘记调
mysql_free_result()会导致内存泄漏,尤其循环查多次时
字符串字段取值前先看 row[i] 是不是 NULL
mysql_fetch_row() 返回的 char** 里,NULL 值对应的是 NULL 指针,不是空字符串。直接 strlen(row[0]) 或 strcpy() 会崩。
立即学习“C++免费学习笔记(深入)”;
- 正确做法:
if (row[0] == nullptr) { /* 字段为 NULL */ } else { /* 安全使用 row[0] */ } - 字段类型信息得自己记——
mysql_fetch_field()能拿到列名、类型(如FIELD_TYPE_LONG)、长度,但不会自动帮你转类型 - 中文乱码?八成是连接时没设字符集:
mysql_set_character_set(conn, "utf8mb4");得在mysql_real_connect()之后立即调
最麻烦的其实是资源清理顺序:必须先 mysql_free_result(),再 mysql_close(),中间夹着 mysql_thread_end()(多线程时)。漏一步,程序退出时可能卡住或崩溃。











