1.MySQL用户管理
1.1用户信息
MySQL中的用户的信息都存储在系统数据库mysql的user表中。表中host字段表示这个用户可以从哪个主机登录,如果是localhost,表示只能从本地登录。user字段是用户名。authentication_string字段是用户加密后的密码。
1.2用户的增删查改
查询用户使用select语句查询MySQL系统自带的mysql数据库的user表即可。
创建用户使用:create user '用户名'@'登录主机/ip' identified by '密码'; 即可。MySQL中涉及password的语句都不会存储在历史命令中。
删除用户使用:drop user '用户名'@'主机名'; 即可。修改用户密码使用:set password=password('新密码'); 即可。
1.3数据库的权限
数据库的权限大致如下。
| 权限 | 列 | 上下文 |
|---|---|---|
| CREATE | Create_priv | 数据库、表或索引 |
| DROP | Drop_priv | 数据库或表 |
| GRANT OPTION | Grant_priv | 数据库、表或保存的程序 |
| REFERENCES | References_priv | 数据库或表 |
| ALTER | Alter_priv | 表 |
| DELETE | Delete_priv | 表 |
| INDEX | Index_priv | 表 |
| INSERT | Insert_priv | 表 |
| SELECT | Select_priv | 表 |
| UPDATE | Update_priv | 表 |
| CREATE VIEW | Create_view_priv | 视图 |
| SHOW VIEW | Show_view_priv | 视图 |
| ALTER ROUTINE | Alter_routine_priv | 保存的程序 |
| CREATE ROUTINE | Create_routine_priv | 保存的程序 |
| EXECUTE | Execute_priv | 保存的程序 |
| FILE | File_priv | 服务器主机上的文件访问 |
| CREATE TEMPORARY TABLES | Create_tmp_table_priv | 服务器管理 |
| LOCK TABLES | Lock_tables_priv | 服务器管理 |
| CREATE USER | Create_user_priv | 服务器管理 |
| PROCESS | Process_priv | 服务器管理 |
| RELOAD | Reload_priv | 服务器管理 |
| REPLICATION CLIENT | Repl_client_priv | 服务器管理 |
| REPLICATION SLAVE | Repl_slave_priv | 服务器管理 |
| SHOW DATABASES | Show_db_priv | 服务器管理 |
| SHUTDOWN | Shutdown_priv | 服务器管理 |
| SUPER | Super_priv | 服务器管理 |
1.4用户的权限
在默认情况下root拥有所有数据库的所有权限。但是新创建的普通用户在默认情况下只能查看个别系统自带的数据库,普通用户想要获取权限只能找root用户来给他赋权:grant 权限列表 on 库.对象名 to '用户名'@'登录位置'; 。权限列表的多个权限用逗号隔开,也可以使用all来代指所有权限。 root也可以回收普通用户的权限:revoke 权限列表 on 库.对象名 from '用户名'@'登录位置';
2.mysql connect
c语言链接mysql的过程大致分为以下步骤:1.创建MSQL对象。2.链接mysql服务。3.执行sql语句。4.如果是selec查询语句就需要创建MYSQL_RES结果集对象。5.获取结果集的数量。6.循环打印结果集。7.释放结果集对象。8.关闭mysql链接。如果是其他的sql语句就不需要4567步。
| 步骤 | 操作 | 关键函数 | 说明 |
|---|---|---|---|
| 1 | 创建 MYSQL 对象 | mysql_init() |
分配和初始化 MYSQL 对象 |
| 2 | 连接 MySQL 服务 | mysql_real_connect() |
连接服务器,传入主机、用户、密码、数据库名等参数 |
| 3 | 执行 SQL 语句 | mysql_query() 或 mysql_real_query() |
执行任意 SQL(增删改查) |
| 4 | 判断是否为 SELECT | mysql_field_count() |
检查受影响的行数或返回结果集 |
| 5 | 创建结果集对象 | mysql_store_result() 或 mysql_use_result() |
仅对返回结果的查询(如 SELECT) |
| 6 | 获取结果集数量 | mysql_num_rows()/ mysql_num_fields/ mysql_fetch_fields |
返回结果集中的行数,列数,行名 |
| 7 | 循环打印/处理结果集 | mysql_fetch_row() |
逐行获取数据,直到返回 NULL |
| 8 | 释放结果集 | mysql_free_result() |
释放 MYSQL_RES 对象 |
| 9 | 关闭连接 | mysql_close() |
关闭 MYSQL 连接句柄 |
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;
// 1. 创建 MYSQL 对象
conn = mysql_init(NULL);
// 2. 连接 MySQL
if (!mysql_real_connect(conn, "localhost", "user", "pass", "db", 0, NULL, 0)) {
// 连接失败处理
}
// 3. 执行 SQL
if (mysql_query(conn, "SELECT * FROM table")) {
// 执行失败处理
}
// 4. 判断是否是 SELECT 类查询
res = mysql_store_result(conn);
if (res) {
// 5. 获取行数(可选)
int num_rows = mysql_num_rows(res);
// 6. 循环打印结果集
while ((row = mysql_fetch_row(res))) {
// 处理每一行数据
printf("%s\n", row[0]);
}
// 7. 释放结果集
mysql_free_result(res);
} else {
// 非 SELECT 查询(INSERT/UPDATE/DELETE 等)
printf("影响行数: %lu\n", mysql_affected_rows(conn));
}
// 8. 关闭连接
mysql_close(conn);