MySQL 普通用户创建与 C/C++ 集成指南
在数据库开发与运维中,权限管控是保障安全的基础。本地连接、远程访问配置以及 C/C++ 程序的对接调用,则是打通'数据库 - 应用'链路的核心环节。开发者常遇到用户登录失败、远程拒绝或接口报错等问题,本文从实战出发,拆解 MySQL 普通用户的创建配置、访问设置及 C/C++ 完整对接流程。
一、普通用户管理
1. 查看用户表
user 表属于 mysql 系统库,需先切换上下文:
use mysql;
查询账户信息:
select host, user, authentication_string from user;
[图片]
2. 创建普通用户
注意:本地登录主机填 localhost,公网访问可用 %。
create user 'username'@'host' identified by 'password';
3. 删除用户
指定主机名(如 localhost、% 或具体 IP):
drop user 'username'@'host';
4. 修改密码
root 账号修改指定用户密码:
set password for 'username'@'host'=password('new_password');
注:普通用户通常无法直接通过 SQL 修改自身密码,建议由管理员操作或使用 ALTER USER 语句(视版本而定)。
5. 权限分配
基本权限指令对应 SQL 关键字。例如授予所有库的读写权限:
grant all privileges on *.* to 'username'@'host';
*.*:所有数据库的所有对象db.*:指定数据库的所有对象
刷新权限生效:
flush privileges;
验证新用户登录授权后的数据库和表:
[图片]
6. 回收权限
revoke all privileges on *.* from 'username'@'host';
二、C/C++ 客户端集成
原理相同,以下以 C 语言为例。
1. 环境准备
Ubuntu 下可直接安装开发包:
sudo apt update && sudo apt install libmysqlclient-dev
若需自行编译,可从官网下载源码导入。
2. 文件检查
安装后头文件位于 /usr/include/mysql,包含 mysql.h。
[图片]
3. 库验证
使用 mysql_get_client_info() 函数检验库是否加载成功。
注意:编译时需指定头文件和库文件路径。
三、核心 API 解析
1. 初始化
MYSQL *my = mysql_init(NULL);
if (my == NULL) {
printf("Init failed: %s\n", mysql_error(my));
}
2. 设置字符集
mysql_options(my, MYSQL_SET_CHARSET_NAME, "utf8mb4");
3. 连接数据库
mysql_real_connect(my, "localhost", "username", "password", "dbname", 3306, NULL, 0);
| 参数 | 含义 | 说明 |
|---|---|---|
mysql | 已初始化的句柄 | mysql_init() 返回值 |
host | 服务器地址 | localhost 或 IP |
user | 用户名 | 你的登录账号 |
passwd | 密码 | 对应密码 |
db | 默认库 | 可填 NULL |
port | 端口 | 默认 3306 |
unix_socket | 套接字 | 本地填 NULL |
client_flag | 标志位 | 默认 0 |
[图片]
4. 关闭连接
mysql_close(my);
5. 执行指令
增删改查
mysql_query() 用于执行非查询类语句。
int mysql_query(MYSQL *mysql, const char *stmt_str);
- 返回
0表示成功,非0为失败。
示例:插入数据并重新编译执行。
[图片]
[图片]
结果验证:
[图片]
获取结果集
SELECT 语句需获取结果集指针。
MYSQL_RES *result = mysql_store_result(my);
- 使用完毕后需调用
mysql_free_result(result)释放资源。
获取行数与列数:
my_ulonglong row_count = mysql_num_rows(result);
unsigned int col_count = mysql_num_fields(result);
获取列元数据:
MYSQL_FIELD *fields = mysql_fetch_fields(result);
name:列名type:数据类型length:定义长度
[图片]
6. 完整代码示例
#include <stdio.h>
#include <mysql.h>
int main() {
// 初始化
MYSQL *my = mysql_init(NULL);
if (my == NULL) {
printf("Error: %s\n", mysql_error(my));
return 1;
}
// 设置字符集
mysql_options(my, MYSQL_SET_CHARSET_NAME, "utf8mb4");
// 连接
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);
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;
}
通过以上步骤,即可完成 MySQL 权限管理与 C/C++ 应用的完整对接。实际开发中请根据网络环境和安全策略调整连接参数。


