从零掌握MySQL:安装配置与C语言连接实战
引言
在前面的文章中,我们学习了 Linux 环境下的各种编程技术。实际项目开发中,数据持久化是不可或缺的一环。MySQL 作为最流行的开源关系型数据库,是后端开发必须掌握的核心技能。
本文将从零开始,系统讲解 MySQL 的安装配置、基本操作、以及 C 语言连接数据库的完整流程。
第一部分:MySQL 安装与配置
一、安装 MySQL
# 1. 切换到管理员权限
sudo su# 2. 安装 MySQL 服务器(包含客户端)
apt install mysql-server
# 安装过程中输入 y 确认下载# 3. 安装开发库(C 语言连接需要)
apt install libmysqlclient-dev
二、查看服务状态
# 查看 MySQL 服务是否运行
service mysql status
# 绿色 active (running) 表示正常运行
# 进程名为 mysqld,这是一个守护进程
最后q是退出
三、修改 root 密码
# 1. 首次登录(初始无密码,直接回车)
mysql -u root -p# 2. 修改密码(在 MySQL 终端中执行)
ALTER USER 'root'@'localhost' IDENTIFIED BY '新密码';
# 注意:必须以分号结尾!# 3. 退出重新登录验证
exit
mysql -u root -p
# 输入新密码
四、MySQL 常用端口
| 服务 | 端口 |
|---|---|
| MySQL | 3306 |
| 查看端口 | netstat -natp | grep mysqld |
第二部分:数据库基本概念
一、什么是数据库
二、CS 架构
MySQL 采用客户端-服务器(CS)架构:
| 角色 | 进程 | 说明 |
|---|---|---|
| 服务器 | mysqld | 守护进程,负责数据存储和管理 |
| 客户端 | mysql | 命令行工具,通过 TCP 连接服务器 |
三、数据库分类
| 类型 | 存储方式 | 代表产品 | 特点 |
|---|---|---|---|
| 关系型数据库 | 二维表格 | MySQL, Oracle | 字段固定,支持 SQL |
| 非关系型数据库 | 键值对 | Redis, MongoDB | 灵活,不支持 SQL |
第三部分:MySQL 基本操作
一、数据库操作
-- 1. 显示所有数据库
SHOW DATABASES;
-- 默认有 4 个系统数据库,不要修改它们-- 2. 创建数据库
CREATE DATABASE c1100db;-- 3. 使用(切换)数据库
USE c1100db;-- 4. 查看当前数据库中的表
SHOW TABLES;
二、常用函数
-- 查看版本
SELECT VERSION();-- 查看当前时间
SELECT NOW();-- 查看当前用户
SELECT USER();
-- 返回格式:root@localhost
-- localhost 表示本地登录
-- % 表示远程登录
三、MySQL 版本发展
| 版本 | 说明 |
|---|---|
| 5.5 | 经典版本 |
| 5.6 | 性能提升 |
| 5.7 | 主流版本(长期使用) |
| 8.0 | 当前最新版,核心改动较大 |
第四部分:表操作
一、数据类型
| 类型 | 说明 | 示例 |
|---|---|---|
INT | 整数,4 字节 | age INT |
TINYINT | 小整数,1 字节 | status TINYINT |
VARCHAR(n) | 变长字符串 | name VARCHAR(20) |
CHAR(n) | 定长字符串 | code CHAR(6) |
DATE | 日期 | birthday DATE |
DATETIME | 日期时间 | created DATETIME |
二、约束条件
| 约束 | 说明 |
|---|---|
NOT NULL | 不能为空 |
UNIQUE | 值不能重复 |
DEFAULT 值 | 默认值 |
PRIMARY KEY | 主键(非空 + 唯一) |
AUTO_INCREMENT | 自动增长 |
三、创建表
-- 切换到目标数据库
USE c1100db;-- 创建 student 表
CREATE TABLE student (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(20) NOT NULL,
age INT DEFAULT 18
);#这个建议不要复制,自己输入或者单行输入否则会有换行符号影响
-- 查看表结构
DESC student;
四、插入数据
-- 插入单条记录
INSERT INTO student VALUES (101, '小王', 13);-- 插入指定字段(id 自增时可省略)
INSERT INTO student (name, age) VALUES ('小李', 22);-- 批量插入
INSERT INTO student (name, age) VALUES
('张三', 20),
('李四', 21),
('王五', 19);
五、查询数据
-- 查询所有字段
SELECT * FROM student;-- 查询指定字段
SELECT name, age FROM student;-- 条件查询
SELECT * FROM student WHERE age > 20;-- 指定显示顺序
SELECT age, name FROM student;
六、更新数据
-- 更新指定记录(必须加 WHERE!)
UPDATE student SET age = 24 WHERE id = 1002;-- 更新多个字段
UPDATE student SET name = '小李', age = 23 WHERE id = 1003;-- 危险操作:不加 WHERE 会更新全部记录!
-- UPDATE student SET age = 22; -- 所有学生年龄都变成 22
七、删除数据
-- 删除指定记录(必须加 WHERE!)
DELETE FROM student WHERE id = 1002;-- 危险操作:不加 WHERE 会清空整个表!
-- DELETE FROM student; -- 删除所有数据
第五部分:C 语言连接 MySQL
一、连接流程
二、基本连接代码
#include <stdio.h> #include <stdlib.h> #include <mysql/mysql.h> int main() { // 1. 定义并初始化连接句柄 MYSQL *conn = mysql_init(NULL); if (conn == NULL) { fprintf(stderr, "mysql_init 失败\n"); return -1; } // 2. 连接数据库 if (mysql_real_connect(conn, "localhost", // 主机地址 "root", // 用户名 "123456", // 密码 "c1100db", // 数据库名 3306, // 端口号 NULL, // Unix 套接字(传 NULL) 0) == NULL) { // 标志位 fprintf(stderr, "连接失败: %s\n", mysql_error(conn)); mysql_close(conn); return -1; } printf("数据库连接成功!\n"); // 3. 执行 SQL 语句 // ...(见后续示例) // 4. 关闭连接 mysql_close(conn); return 0; }编译命令:
gcc program.c -o program -lmysqlclient
三、插入数据
// 在连接成功后执行 const char *sql = "INSERT INTO student (name, age) VALUES ('小张', 23)"; if (mysql_query(conn, sql) != 0) { fprintf(stderr, "插入失败: %s\n", mysql_error(conn)); } else { printf("插入成功!\n"); }四、更新数据
const char *sql = "UPDATE student SET name = '小张' WHERE id = 1003"; if (mysql_query(conn, sql) != 0) { fprintf(stderr, "更新失败: %s\n", mysql_error(conn)); } else { printf("更新成功!\n"); }五、删除数据
const char *sql = "DELETE FROM student WHERE id = 1002"; if (mysql_query(conn, sql) != 0) { fprintf(stderr, "删除失败: %s\n", mysql_error(conn)); } else { printf("删除成功!\n"); }六、查询数据(需要处理结果集)
// 执行查询 const char *sql = "SELECT * FROM student"; if (mysql_query(conn, sql) != 0) { fprintf(stderr, "查询失败: %s\n", mysql_error(conn)); return -1; } // 获取结果集 MYSQL_RES *result = mysql_store_result(conn); if (result == NULL) { fprintf(stderr, "获取结果失败: %s\n", mysql_error(conn)); return -1; } // 获取列数 int num_fields = mysql_num_fields(result); // 获取行数 int num_rows = mysql_num_rows(result); printf("查询到 %d 条记录:\n", num_rows); // 逐行读取 MYSQL_ROW row; while ((row = mysql_fetch_row(result))) { for (int i = 0; i < num_fields; i++) { printf("%s\t", row[i] ? row[i] : "NULL"); } printf("\n"); } // 释放结果集 mysql_free_result(result);七、批量插入数据
char sql_buffer[256]; for (int i = 1; i <= 10000; i++) { sprintf(sql_buffer, "INSERT INTO student (name, age) VALUES ('学生%d', %d)", i, 18 + (i % 10)); if (mysql_query(conn, sql_buffer) != 0) { fprintf(stderr, "第 %d 条插入失败: %s\n", i, mysql_error(conn)); } } printf("批量插入完成!\n");第六部分:常用操作速查表
一、终端命令
| 命令 | 说明 |
|---|---|
mysql -u root -p | 登录 MySQL |
SHOW DATABASES; | 查看所有数据库 |
CREATE DATABASE 库名; | 创建数据库 |
USE 库名; | 切换数据库 |
SHOW TABLES; | 查看当前库所有表 |
DESC 表名; | 查看表结构 |
exit/quit | 退出 |
二、SQL 语句
| 操作 | 语句模板 |
|---|---|
| 插入 | INSERT INTO 表 VALUES(值1, 值2, ...); |
| 查询 | SELECT * FROM 表 WHERE 条件; |
| 更新 | UPDATE 表 SET 字段=值 WHERE 条件; |
| 删除 | DELETE FROM 表 WHERE 条件; |
三、C 语言 API
| API | 作用 |
|---|---|
mysql_init() | 初始化连接句柄 |
mysql_real_connect() | 建立连接 |
mysql_query() | 执行 SQL |
mysql_store_result() | 获取结果集 |
mysql_num_rows() | 获取行数 |
mysql_fetch_row() | 逐行读取 |
mysql_free_result() | 释放结果集 |
mysql_error() | 获取错误信息 |
mysql_close() | 关闭连接 |
总结
一、MySQL 操作核心流程
二、重要注意事项
| 注意点 | 说明 |
|---|---|
| SQL 语句分号 | 终端中必须加分号,C 代码中可省略 |
| UPDATE/DELETE 的 WHERE | 不加 WHERE 会影响全部记录 |
| 字符串用单引号 | '值',不是双引号 |
| 编译链接 | 必须加-lmysqlclient |
| 连接复用 | 一次连接可执行多条 SQL |
| 结果集释放 | mysql_free_result()防止内存泄漏 |
三、一句话记忆
MySQL 是 CS 架构的关系型数据库,数据以二维表形式存储。C 语言通过mysql_init → mysql_real_connect → mysql_query → mysql_close四步操作数据库,编译时需链接-lmysqlclient库。
