跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++

MySQL 权限管理与 C/C++ 客户端接入实战

MySQL 权限管理与 C/C++ 客户端接入实战涵盖用户创建、权限分配及 C 语言 API 调用。重点包括通过 SQL 命令管理普通用户权限,配置本地与远程连接,以及使用 libmysqlclient 库实现 C 程序对数据库的增删改查。文章修正了常见密码修改错误,提供了完整的连接、查询及结果集处理代码示例,适合需要深度集成数据库功能的开发者参考。

芝士奶盖发布于 2026/3/23更新于 2026/9/1161 浏览
MySQL 权限管理与 C/C++ 客户端接入实战

在 MySQL 开发与运维中,普通用户的创建与权限管控是保障数据库安全的基础,而本地连接、远程访问的配置,以及 C/C++ 程序的对接调用,则是打通'数据库 - 应用'链路的核心环节。很多开发者在实际操作中会遇到'用户创建后登录失败''远程连接被拒绝''C/C++ 接口调用报错'等问题,本文从实战出发,拆解 MySQL 普通用户的创建配置、本地/远程登录的关键步骤,以及 C/C++ 访问 MySQL 的完整流程。

普通用户的创建与管理

查看 user 表

user表属于 mysql数据库,需先切换到该库:

use mysql;

再在 user 表查看账户信息:

select host,user,authentication_string from user;

文章配图

创建普通用户

注意:本地登录时,主机名填 localhost;若需公网登录,可填 %。

create user '用户名'@'登陆主机/ip' identified by '密码';
删除普通用户

主机名可用 localhost、% 或真实 IP 替换:

drop user '用户名'@'主机名';
修改密码

修改当前用户密码:

set password for '用户名'@'主机名'=password('新的密码');
数据库权限

权限列表基本对应 SQL 指令关键字。给用户添加权限:

grant 权限列表 on 库。对象名 to '用户名'@'登陆位置';

其中 *.* 代表所有数据库的所有对象,库.* 表示某个数据库中的所有数据对象。

刷新权限使配置生效:

flush privileges;

随后使用新创建的普通用户登入授权后的数据库和表进行验证。

回收权限

如需收回权限,执行以下语句:

revoke 权限列表 on 库。对象名 from '用户名'@'登陆位置';

使用 C 语言链接访问库

如果是 C++ 语言,原理相同。

下载库文件

推荐直接通过包管理器安装,以 Ubuntu 为例:

sudo apt update && sudo apt install libmysqlclient-dev
查看库文件

安装完成后,头文件和库文件通常位于 /usr/include/mysql 目录下,可以看到 mysql.h。

文章配图

编译时需要指定头文件和库文件的位置。

语言检验

利用 mysql_get_client_info() 函数可以检验库文件是否导入成功。

语言操作库(接口学习)

初始化

首先初始化 MYSQL 结构体:

MYSQL *my = mysql_init(NULL);
设置字符集

建议显式设置字符集以避免乱码:

mysql_options(my, MYSQL_SET_CHARSET_NAME, "utf8mb4");
连接 MySQL

使用 mysql_real_connect 建立连接,参数说明如下:

参数含义场景取值
mysql已初始化的句柄指针mysql_init()返回的指针
hostMySQL 服务器地址本地填"localhost"或"127.0.0.1"
userMySQL 登录用户名你的用户名
passwd登录密码实际密码
db默认连接的数据库名如"testdb",不指定填NULL
portMySQL 服务端口默认3306
unix_socket本地套接字文件本地连接填NULL
client_flag连接标志默认填0

文章配图

关闭连接

使用完毕后及时释放资源:

mysql_close(my);
操作指令
增删改查

执行 SQL 语句使用 mysql_query,成功返回 0,失败返回非 0:

int mysql_query(MYSQL *mysql, const char *stmt_str);

例如插入数据后重新编译执行,观察结果变化。

文章配图

文章配图

文章配图

文章配图

获取输出内容

mysql_query无法直接显示查询结果,需将输出内容放入二维矩阵中遍历。核心接口如下:

//获取结果集
MYSQL_RES *result = mysql_store_result(my);

//关闭结果集
mysql_free_result(result);

//获取行数
my_ulonglong mysql_num_rows(MYSQL_RES *res);

//获取列数
unsigned int mysql_num_fields(MYSQL_RES *res);

//获取列名称
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);

注意:result 相当于文件句柄,使用完需及时关闭。

完整代码示例
#include<stdio.h>
#include<mysql.h>

int main() {
    // 初始化
    MYSQL* my = mysql_init(NULL);
    if(my == NULL) {
        printf("sorry, mysql_init is errno");
        return 1;
    }

    // 设置字符集
    mysql_options(my, MYSQL_SET_CHARSET_NAME, "utf8mb4");

    // 连接 MySQL
    mysql_real_connect(my, "localhost", "newuser", "123456", "hello", (unsigned int)3306, NULL, (unsigned long)0);

    // 执行查询
    const char* ptr = "select * from student";
    mysql_query(my, ptr);

    // 获取结果集
    MYSQL_RES *result = mysql_store_result(my);

    // 获取行数和列数
    my_ulonglong row_count = mysql_num_rows(result);
    unsigned int col_count = mysql_num_fields(result);

    // 获取列名称
    MYSQL_FIELD *fields = mysql_fetch_fields(result);

    // 打印列名称
    for(unsigned int i=0; i<col_count; i++) {
        printf("%s\t", fields[i].name);
    }
    printf("\n");

    // 打印数据
    MYSQL_ROW row;
    while (row = mysql_fetch_row(result)) {
        for (unsigned int i = 0; i < col_count; i++) {
            printf("%s\t", row[i]);
        }
        printf("\n");
    }

    // 释放资源
    mysql_free_result(result);
    mysql_close(my);
    return 0;
}

目录

  1. 普通用户的创建与管理
  2. 查看 user 表
  3. 创建普通用户
  4. 删除普通用户
  5. 修改密码
  6. 数据库权限
  7. 回收权限
  8. 使用 C 语言链接访问库
  9. 下载库文件
  10. 查看库文件
  11. 语言检验
  12. 语言操作库(接口学习)
  13. 初始化
  14. 设置字符集
  15. 连接 MySQL
  16. 关闭连接
  17. 操作指令
  18. 增删改查
  19. 获取输出内容
  20. 完整代码示例

更多推荐文章

查看全部
  • node-llama-cpp 跨平台安装与配置实战
  • AI 辅助游戏开发实战:基于 DeepSeek 构建贪吃蛇应用
  • C++ 类与对象详解:封装、实例化与 this 指针
  • Node.js + uni-app 运动健康 App 计算机毕业设计
  • OpenClaw 开源桌面 AI Agent 框架功能与架构解析
  • 提升大模型系统体验的设计思路与方案
  • C++ 基于正倒排索引的 Boost 搜索引擎:日志宏与 Server 端实现
  • GitHub Copilot SDK 与云原生多智能体系统构建
  • Flutter 构建 compileDebugJavaWithJavac 报错时的阿里云 Maven 镜像配置
  • 吴恩达机器学习:逻辑回归算法详解
  • 汽车雷达多径环境下的幽灵目标检测方法研究
  • 从 0 到 1 打造 RISC-V 智能家居中控:硬件 + 固件 + 通信全链路实战
  • 2024 中国“大模型 + 智能客服”最佳实践案例 TOP10
  • RocksDB 在鲲鹏架构下的性能优化源码解析
  • 分布式文件系统 HDFS 编程实践
  • ChatGPT 核心功能与实战技巧指南
  • 使用 Capacitor 将 Google AI Studio 生成代码打包为 Android APK
  • VS Code 远程连接时 Copilot 无法使用 Claude 模型的解决方法
  • Chaterm 开源 AI 智能终端与 SSH 客户端功能解析
  • 就业环境变化下的数据分析技能提升与职业路径规划

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online