跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
SQL

MySQL 权限管控与 C/C++ 客户端接入实战指南

MySQL 普通用户的创建、权限分配及密码管理流程,涵盖本地与远程连接配置。重点讲解 C/C++ 环境下通过 libmysqlclient 库进行数据库交互的完整实现,包括环境搭建、API 接口初始化、字符集设置、SQL 执行及结果集遍历。提供经过优化的完整代码示例,包含错误处理与资源释放机制,帮助开发者解决跨端登录失败及接口调用报错问题,确保数据库访问的安全性与稳定性。

Stephaine Walsh发布于 2026/3/30更新于 2026/6/421 浏览
MySQL 权限管控与 C/C++ 客户端接入实战指南

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

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

一、普通用户的创建与管理

1. 查看 user 表

user 表属于 mysql 系统库,需先切换到该库:

use mysql;

再在 user 表查看账户信息:

select host, user, authentication_string from user;
2. 创建普通用户

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

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

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

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

自己改自己的密码:

set password = password('新的密码');

root 账号改指定普通用户的密码:

set password for '用户名'@'主机名' = password('新的密码');

提示: MySQL 8.0+ 推荐使用 ALTER USER 语法,旧版本兼容 SET PASSWORD。

5. 数据库权限

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

grant 权限列表 on 库。对象名 to '用户名'@'登陆位置';
  • *.*:代表本系统中所有数据库的所有对象(表、视图、存储过程等)
  • 库.*:表示某个数据库中的所有数据对象

例如授予某用户对特定库的读写权限:

grant select, insert, update, delete on testdb.* to 'newuser'@'%';

刷新权限使配置立即生效:

flush privileges;

随后使用新创建的普通用户登入访问授权的数据库和表即可验证。

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

二、使用 C 语言链接访问库

如果是 C++ 语言,原理相同,头文件包含方式略有不同。

1. 下载库文件

推荐从官网下载并导入,或在 Ubuntu 终端直接安装开发包:

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

列出包对应的所有文件(包括头文件、库文件):

dpkg -L libmysqlclient-dev

库文件通常放在 /usr/include/mysql 目录下,可以看到 mysql.h。

3. 语言检验

利用下面的函数来检验库文件是否导入成功:

mysql_get_client_info();

编译时需要告诉编译器头文件和库文件的位置,先找头文件再链接库文件。

三、语言操作库(接口学习)

1. 初始化
MYSQL *my = mysql_init(NULL);
if (my == NULL) {
    printf("Error: mysql_init failed\n");
}
2. 设置字符集

避免中文乱码,建议设置为 utf8mb4:

mysql_options(my, MYSQL_SET_CHARSET_NAME, "utf8mb4");
3. 连接 MySQL
mysql_real_connect(MYSQL *mysql, const char *host, const char *user, 
                   const char *passwd, const char *db, unsigned int port, 
                   const char *unix_socket, unsigned long client_flag);
参数含义场景取值
mysql已初始化的句柄指针mysql_init() 返回的指针
hostMySQL 服务器地址本地填 "localhost" 或 "127.0.0.1"
userMySQL 登录用户名你的用户名
passwd登录密码实际密码
db默认连接的数据库名如 "testdb",不指定填 NULL
port服务端口默认 3306
unix_socket本地套接字文件本地连接填 NULL
client_flag连接标志默认填 0
4. 关闭连接
mysql_close(my);
5. 操作指令
(1)增删
int mysql_query(MYSQL *mysql, const char *stmt_str);
  • 参数:mysql 为连接句柄,stmt_str 为要执行的 SQL 字符串
  • 返回值:成功返回 0,失败返回非 0
(2)获取输出内容

如果执行 SELECT 语句,结果不会直接打印,而是存储在结果集中。需要遍历二维字符串数组来获取数据。

// 获取结果集
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);

注意: result 相当于文件流,使用完必须及时释放。

6. 完整代码示例

以下是一个完整的 C 语言连接查询示例,包含了错误处理和资源释放:

#include <stdio.h>
#include <mysql.h>

int main() {
    // 初始化
    MYSQL *my = mysql_init(NULL);
    if (my == NULL) {
        printf("Error: mysql_init failed\n");
        return 1;
    }

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

    // 连接 MySQL
    if (!mysql_real_connect(my, "localhost", "newuser", "123456", "hello", 
                            3306, NULL, 0)) {
        printf("Connection failed: %s\n", mysql_error(my));
        mysql_close(my);
        return 1;
    }

    // 执行查询
    const char *ptr = "select * from student";
    if (mysql_query(my, ptr)) {
        printf("Query failed: %s\n", mysql_error(my));
        mysql_close(my);
        return 1;
    }

    // 获取结果集
    MYSQL_RES *result = mysql_store_result(my);
    if (result == NULL) {
        printf("No result set\n");
        mysql_close(my);
        return 1;
    }

    // 获取行列信息
    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] ? row[i] : "NULL");
        }
        printf("\n");
    }

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

    return 0;
}

编译时记得链接 libmysqlclient,例如:

gcc main.c -o app -lmysqlclient

目录

  1. MySQL 权限管控与 C/C++ 客户端接入实战
  2. 一、普通用户的创建与管理
  3. 1. 查看 user 表
  4. 2. 创建普通用户
  5. 3. 删除普通用户
  6. 4. 修改密码
  7. 5. 数据库权限
  8. 6. 回收权限
  9. 二、使用 C 语言链接访问库
  10. 1. 下载库文件
  11. 2. 查看库文件
  12. 3. 语言检验
  13. 三、语言操作库(接口学习)
  14. 1. 初始化
  15. 2. 设置字符集
  16. 3. 连接 MySQL
  17. 4. 关闭连接
  18. 5. 操作指令
  19. (1)增删
  20. (2)获取输出内容
  21. 6. 完整代码示例
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • 循环神经网络(RNN)与 LSTM 文本分类实战
  • MySQL 详细安装配置完整教程
  • Ollama 结合 VSCode 插件实现本地代码生成与解释
  • 本地部署 Llama 3.1:Ollama、OpenWeb UI 与 Spring AI 集成指南
  • 网络安全自学指南:三个阶段与核心学习路线
  • C++ string 类详解:初始化、遍历与常用成员函数
  • 树莓派 Ubuntu 24.04.3 LTS 安装 OpenClaw 指南
  • Memo AI:基于 Whisper 的本地视频转文字工具评测
  • C++进阶:unordered_set 和 unordered_map 详解及哈希表模拟实现
  • DeepSeek 深度使用指南:提示词技巧与本地知识库搭建
  • 带电/含锂电/储能产品出口的三条合规新变化
  • Spring Cloud Gateway Web MVC 使用指南
  • 评分卡模型构建全流程:金融风控领域核心算法详解
  • Linux Shell 脚本中 date 命令常用用法
  • 论文阅读:Vision-skeleton 双模态框架用于帕金森病步态泛化评估
  • Krita AI 绘画插件本地部署与使用指南
  • OPC 一人公司创业指南:AI 时代的商业闭环与实战
  • Go 语言快速学习总结
  • 深入理解 Python GIL 机制与影响
  • 3DMAX VR 渲染器局部渲染设置

相关免费在线工具

  • SQL 美化和格式化

    在线格式化和美化您的 SQL 查询(它支持各种 SQL 方言)。 在线工具,SQL 美化和格式化在线工具,online

  • SQL转CSV/JSON/XML

    解析 INSERT 等受限 SQL,导出为 CSV、JSON、XML、YAML、HTML 表格(见页内语法说明)。 在线工具,SQL转CSV/JSON/XML在线工具,online

  • CSV 工具包

    CSV 与 JSON/XML/HTML/TSV/SQL 等互转,单页多 Tab。 在线工具,CSV 工具包在线工具,online

  • Base64 字符串编码/解码

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

  • Base64 文件转换器

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

  • Markdown转HTML

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