19 C/C++ 操作 MySQL

19 C/C++ 操作 MySQL
小米里的大麦C/C++ 操作 MySQL
1. 准备工作
1. 环境准备
安装 MySQL 的 C 语言客户端开发库(包含头文件和链接库):
1 | sudo apt update |
另一个命令(可选):
1 | sudo apt install -y build-essential pkg-config default-libmysqlclient-dev |
这条命令会安装:
- build-essential:包含 gcc、g++、make 等编译工具链。
- pkg-config:用于管理库的编译和链接参数,方便 Makefile 或构建系统自动获取头文件路径和库名称。
- default-libmysqlclient-dev:这是一个“元包”,在 Ubuntu 上通常依赖于具体的 MySQL 客户端开发库(如
libmysqlclient-dev),相当于自动选择并安装当前发行版推荐的 MySQL 客户端库。
如果希望在 C++ 中使用更“面向对象”的接口,可以考虑安装 MySQL Connector/C++:
1 | sudo apt install libmysqlcppconn-dev # Ubuntu 某些版本可能不包,需从源码或第三方源安装 |
2. C 和 C++ 接口初识
MySQL C API:这是 MySQL 官方提供的原生 C 语言接口,头文件为
<mysql/mysql.h>,所有函数均以 C 语言风格导出(如mysql_init()、mysql_query()等)。C++ 程序完全可以直接包含此头文件并调用这些函数,因为 C++兼容 C 语言。因此,如果使用 C API,那么头文件和函数接口在 C 和 C++中是完全相同的。MySQL Connector/C++:这是 MySQL 官方提供的面向 C++ 的专用驱动,使用面向对象的风格(如
sql::Connection、sql::Statement等),需要安装额外的开发库(如libmysqlcppconn-dev)。它与 C API 不同,头文件也不一样(如<mysql_connection.h>)。这类接口是 C++特有的,C 语言无法直接使用。
2. 在 Linux 中用 C/C++操作 MySQL
1. 准备工作
先在 MySQL 中创建对应的用户并赋予权限等信息:
1 | # 创建用户:仅允许本机登录,密码为 123456 |
2. C 代码操作 MySQL
1 |
|
makefile 文件:
1 | C_conn_mysql: C_conn_mysql.c |
-I:用于指明头文件的搜索路径。-L:用于指明库文件的搜索路径。-l:用于指明需要连接库文件路径下的哪一个库。
输出:
1 | 插入成功,影响行数: 2 |
3. C++ 操作 MySQL
1 |
|
运行输出结果:
1 | 插入成功,影响行数: 1 |
3. Windows 中使用 C/C++ 操作 MySQL
1. 准备工作:确保 Linux 上的 MySQL 允许远程连接
修改 MySQL 配置文件: 更改或新增
bind-address行为0.0.0.01
vim /etc/mysql/mysql.conf.d/mysqld.cnf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96#
# The MySQL database server configuration file.
#
# One can use all long options that the program supports.
# Run program with --help to get a list of available options and with
# --print-defaults to see which it would actually understand and use.
#
# For explanations see
# http://dev.mysql.com/doc/mysql/en/server-system-variables.html
# Here is entries for some specific programs
# The following values assume you have at least 32M ram
[mysqld]
#
# * Basic Settings
#
user = mysql
# pid-file = /var/run/mysqld/mysqld.pid
# socket = /var/run/mysqld/mysqld.sock
# port = 3306
# datadir = /var/lib/mysql
# If MySQL is running as a replication slave, this should be
# changed. Ref https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_tmpdir
# tmpdir = /tmp
#
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
bind-address = 127.0.0.1
mysqlx-bind-address = 127.0.0.1
# ===== 自定义扩展配置 =====
# 设置默认字符集为 utf8mb4,防止中文和 emoji 乱码
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
# 启用远程访问(默认仅本机),保持仅本地访问(通过 Xshell 登录服务器再操作)可将 0.0.0.0 设置为 127.0.0.1
bind-address = 0.0.0.0
mysqlx-bind-address = 0.0.0.0
# 使用传统认证插件,兼容 Navicat、旧版客户端
default-authentication-plugin = mysql_native_password
# 可选:增加连接稳定性
# max_connections = 200
# wait_timeout = 600
# interactive_timeout = 600
#
# * Fine Tuning
#
key_buffer_size = 16M
# max_allowed_packet = 64M
# thread_stack = 256K
# thread_cache_size = -1
# This replaces the startup script and checks MyISAM tables if needed
# the first time they are touched
myisam-recover-options = BACKUP
# max_connections = 151
# table_open_cache = 4000
#
# * Logging and Replication
#
# Both location gets rotated by the cronjob.
#
# Log all queries
# Be aware that this log type is a performance killer.
# general_log_file = /var/log/mysql/query.log
# general_log = 1
#
# Error log - should be very few entries.
#
log_error = /var/log/mysql/error.log
#
# Here you can see queries with especially long duration
# slow_query_log = 1
# slow_query_log_file = /var/log/mysql/mysql-slow.log
# long_query_time = 2
# log-queries-not-using-indexes
#
# The following can be used as easy to replay backup logs or for replication.
# note: if you are setting up a replication slave, see README.Debian about
# other settings you may need to change.
# server-id = 1
# log_bin = /var/log/mysql/mysql-bin.log
# binlog_expire_logs_seconds = 2592000
max_binlog_size = 100M
# binlog_do_db = include_database_name
# binlog_ignore_db = include_database_name然后重启 MySQL:
1
sudo systemctl restart mysql
创建允许从 Windows IP 连接的数据库用户(或修改现有用户)
1
2
3
4
5mysql> create user 'win_test'@'%' identified by '123456';
Query OK, 0 rows affected (0.01 sec)
mysql> grant all privileges on *.* to 'win_test'@'%';
Query OK, 0 rows affected (0.01 sec)检查防火墙:确保 Linux 防火墙(如 ufw)开放 MySQL 端口(默认 3306):
1
sudo ufw allow 3306/tcp
2. 在 Windows 上安装 MySQL
下载:访问 MySQL Community Downloads,选择 Windows (x86, 64-bit), ZIP Archive 或 MSI Installer。
安装:如果下载 ZIP,解压后将其
C:\Program Files\MySQL\MySQL Server 8.4\bin目录添加到系统 PATH;如果使用 MSI,安装过程中仅选择 “Client Programs” 即可。使用:打开命令提示符,执行:
1
mysql -h 12x.5x.16x.x -P 3306 -u win_test -p # 用自己公网 IP
在 Windows 上通过 MySQL Installer 安装 MySQL Server 时,通常就会包含 C API 客户端库(libmysql),但需要注意安装选项。
1. 验证 MySQL Server 是否已包含 C API 库
检查安装目录: 打开 MySQL 的安装路径(C:\Program Files\MySQL\MySQL Server 8.4),查看是否存在以下文件夹和文件:
include文件夹:里面应该有mysql.h、mysql_com.h等头文件。lib文件夹:里面应该有libmysql.lib(静态库/导入库)和libmysql.dll(动态链接库)。- 如果能找到路径(如
C:\Program Files\MySQL\MySQL Server 8.4\lib\libmysql.dll),也说明已安装。
如果这些文件存在,说明 C API 库已随服务器安装。若缺少,可能是安装时未选择开发组件。
2. 如果缺少开发组件怎么办?
- 重新运行 MySQL Installer,选择 “Modify”,然后勾选 “Development Components” 或 “C Connector”,安装即可。
- 或者直接下载独立的 Connector/C 并解压到任意目录,后续配置时指向该目录。
3. 在 Visual Studio 中配置 C/C++项目
假设 MySQL 安装在 C:\Program Files\MySQL\MySQL Server 8.4(或 Connector/C 解压目录)。视频可参考:【C/C++服务器开发】C 语言/C++连接 mysql | B 站。
1. 创建项目并配置属性
- 打开 Visual Studio,创建新的控制台应用(C++)。
- 点击 项目 → 属性(注意配置选择“所有配置”,平台选择“x64”或“x86”匹配 MySQL 库版本)。
- 在 VC++ 目录 中:
- 包含目录:添加
C:\Program Files\MySQL\MySQL Server 8.4\include - 库目录:添加
C:\Program Files\MySQL\MySQL Server 8.4\lib
- 包含目录:添加
- 在 链接器 → 输入 → 附加依赖项 中添加
libmysql.lib。
2. 放置运行时 DLL
将 libmysql.dll 从 lib 文件夹复制到可执行文件(.exe)输出目录(例如 Debug 或 Release),可以参考我的路径:D:\Coding\Visual Studio 2022\pro\x64\Debug。
3. 测试代码
1 |
|
点击运行,会发现报错了,说找不到 xxx.dll(具体名字忘记了),再网络上找了一大圈,找到方案:将路径 C:\Program Files\MySQL\MySQL Server 8.4\lib 中的``libmysql.dll和libmysql.lib一并放到D:\Coding\Visual Studio 2022\pro\x64\Debug里面。激动的心颤抖的手点击运行,再次报错:**系统错误,由于找不到 libssl-3-x64.dll,无法继续执行代码。重新安装程序可能会解决此问题。**真是天塌了,于是苦苦再次寻觅互联网,才找到解决办法:**[解决 libssl-3-x64.dll 问题的办法](https://www.reddit.com/r/PunishingGrayRaven/comments/1boqyag/for_people_with_libssl3x64dll_problems/?tl = zh-hans)、[Punishing gray raven dll 下载](https://drive.google.com/drive/folders/1zirEVN3fSRQL68aNDy5tgH8JxCJwLeP9)**。说实话,我也并不清楚原因,只是将下载下来的 2 个动态共享库文件一并放入到了.exe`同级目录下(前前后后总共放了 4 个文件),再次运行成功得到输出:
我自己也不清楚,具体原因和解决原理,所以仅仅是将我的经验供大家参考! Google 搜索多次救我于水火,如果期间有其他报错,不妨试试 Google 搜索看看!
4. 在 VS Code 中配置 C/C++项目(使用 CMake)
在 VS Code 上配置就比较灵活了,方式比较多样,我们主要使用 VS Code 配合 CMake 工具链(CMake Tools 插件),因为配置比较灵活。其他方法自行 B 站/Google 了,另外,推荐文章:VSCode 环境下连接 MySQL 8.0 数据库 (C++)。
1. 安装必要插件
- C/C++ 插件(Microsoft)
- CMake Tools 插件
2. 项目结构示例
1 | test/ |
3. 编写 CMakeLists.txt
1 | cmake_minimum_required(VERSION 3.10) |
4. 配置 CMake Tools
- 打开项目,CMake Tools 会自动检测工具链。
- 选择配置(如 Visual Studio 2022 Release - x64)。
- 构建(F7),然后运行。
如果不想使用 CMake,也可以手动编写 tasks.json 和 launch.json 配置编译命令,但 CMake 更推荐。
5. 关于 libmysql.dll
无论使用哪种方式,都需要确保 libmysql.dll 在运行时可被找到!
- 将 DLL 复制到生成的可执行文件目录(例如
build/Debug/)。 - 或将 MySQL 的
lib目录添加到系统 PATH。
4. 关于 MySQL Connector/C++ 的讨论
| 特性 | MySQL C API | MySQL Connector/C++ |
|---|---|---|
| 底层 | C 语言接口 | C++面向对象封装 |
| 性能 | 极高 | 接近 C API,略有损耗 |
| 易用性 | 较繁琐 | 简洁,支持异常 |
| 预处理语句 | 支持但较复杂 | 原生友好支持 |
| 稳定性 | 非常成熟 | 8.x 后稳定,早期有历史问题 |
| 依赖 | 仅 libmysqlclient | 需安装专用库 |
| 流行度 | 非常广泛(尤其是老项目) | 较新,逐渐增加 |
实际 C++ 后端中,业务代码一般不会直接大量使用裸的 MySQL C API,而是会在底层基于 C API 封装一层数据库访问模块(如连接管理、SQL 执行、事务、结果集解析、连接池等)。MySQL Connector/C++ 虽然能用,但使用较少;更常见的是采用基于 C API 的第三方轻量库或公司内部封装,因为它们更稳定、更通用,也更方便控制性能和部署。
所以,大多数情况,我们只需要掌握 MySQL C API 的使用就行了,进阶基本上都是使用第三方库、个人/公司封装的版本、其他更便捷的方式。当然连接方式也会多样,也可以尝试一系列的图形化工具……














