MySQL 权限管理与 C/C++ 开发对接指南
在 MySQL 开发与运维中,普通用户的创建与权限管控是保障数据库安全的基础,而本地连接、远程访问的配置,以及 C/C++ 程序的对接调用,则是打通'数据库 - 应用'链路的核心环节。
介绍 MySQL 普通用户的创建、权限分配与管理,涵盖本地及远程连接配置。同时详细讲解使用 C 语言通过 mysqlclient 库连接数据库的方法,包括初始化、字符集设置、连接建立、增删操作及结果集获取,并提供完整代码示例,帮助开发者实现 C/C++ 程序与 MySQL 的高效对接。

在 MySQL 开发与运维中,普通用户的创建与权限管控是保障数据库安全的基础,而本地连接、远程访问的配置,以及 C/C++ 程序的对接调用,则是打通'数据库 - 应用'链路的核心环节。
user 表属于 mysql 数据库,需先切换到该库:
use mysql; -- 切换到 mysql 数据库
再在 user 表查看账户:
select host,user,authentication_string from user;
注意:本地登录,'登录主机/ip'填 localhost 即可,想简单的公网登录填 %
create user '用户名'@'登陆主机/ip' identified by '密码';
主机名可以用上面的 localhost 或者 % 替换,也可以用真实的主机 IP
drop user '用户名'@'主机名';
修改当前用户密码:
set password for '用户名'@'主机名' = password('新的密码');
root 账号改指定普通用户的密码:
set password for '用户名'@'主机名' = password('新的密码');
权限列表如下,基本就是任务指令关键字: 给用户添加权限:
grant 权限列表 on 库。对象名 to '用户名'@'登陆位置';
* . * : 代表本系统中的所有数据库的所有对象(表,视图,存储过程等)
库 . * : 表示某个数据库中的所有数据对象 (表,视图,存储过程等)
刷新权限:
flush privileges;
然后使用 newuser 普通用户登入访问授权的数据库和表。
revoke 权限列表 on 库。对象名 from '用户名'@'登陆位置';
如果是 C++ 语言,原理相同!
可前往官网下载并导入: https://dev.mysql.com/downloads/ 如果你是 Ubuntu,可以终端直接执行下面指令安装库:
sudo apt update && sudo apt install libmysqlclient-dev
# 列出包对应的所有文件(包括头文件、库文件) dpkg -L libmysqlclient-dev
库文件被放在 /usr/include/mysql 目录下:可以看到有 mysql.h
利用下面的函数来检验库文件是否导入成功:
mysql_get_client_info()
注意:编译需要告诉编译器头文件和库文件的位置,先找头文件再链接库文件
mysql_init(NULL);
mysql_options(初始化的 mysql 指针,MYSQL_SET_CHARSET_NAME, "utf8mb4");
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 句柄指针 | mysql_init() 返回的指针 |
host | MySQL 服务器地址 | 本地连接填 "localhost" 或 "127.0.0.1" 或具体 IP |
user | MySQL 登录用户名 | 你的 "newuser" |
passwd | 登录密码 | newuser 的实际密码(如 "123456") |
db | 要默认连接的数据库名 | 你需要访问的数据库(如 "testdb",填 NULL 则不指定) |
port | MySQL 服务端口 | 默认 3306 |
unix_socket | 本地套接字文件(仅 Unix/Linux) | 本地连接填 NULL(使用默认套接字) |
client_flag | 连接标志(如压缩、SSL 等) | 默认填 0 即可 |
// 关闭连接,释放资源 mysql_close(mysql_init 返回的指针);
int mysql_query(MYSQL *mysql, const char *stmt_str);
mysql 为连接句柄,stmt_str 为要执行的 SQL 字符串0,失败返回非 0解决问题:如果利用 mysql_query 执行打印相关的语句,比如 select 是无法显示的 其实它是将输出的内容信息放在一个二维矩阵里面,二级指针的形式,返回给我们行和列,只要遍历它返回的行和列也就遍历了整个二维字符串数组,拿到了输出内容,下面是接口:
// 获取结果集,有了这个函数才可以继续 MYSQL_RES *result = mysql_store_result(mysql_init 的返回值);
// 关闭文件接口 mysql_free_result(result);
注意:上面这个 result 相当于就是文件接口,使用完需要及时关闭
// 获取结果行数 my_ulonglong mysql_num_rows(MYSQL_RES *res);
res 是 mysql_store_result() 返回的结果集指针my_ulonglong 是无符号长整型,可通过 %llu 格式化输出)// 获取结果列数 unsigned int mysql_num_fields(MYSQL_RES *res);
res 是结果集指针// 获取列名称 MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
res 是结果集指针。MYSQL_FIELD 结构体数组,数组长度等于 mysql_num_fields(res) 的返回值。每个 MYSQL_FIELD 结构体的核心成员包括:
name:列名(字符串);type:列的数据类型(如 MYSQL_TYPE_INT 对应 INT 类型);length:列的定义长度。#include<stdio.h>
#include<mysql.h>
int main() {
// 初始化
MYSQL* my = mysql_init(NULL);
if(my==NULL) {
printf("sorry,mysql_init is errno");
}
// 设置字符集
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");
// 打印数据 (row 用来读取每一行的数据)
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;
}

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML 转 Markdown 互为补充。 在线工具,Markdown 转 HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML 转 Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online
将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online