引言
在前面的文章中,我们学习了 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 |
第二部分:数据库基本概念
一、什么是数据库

二、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
一、连接流程

二、基本连接代码
cpp
#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
三、插入数据
cpp
// 在连接成功后执行
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");
}
四、更新数据
cpp
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");
}
五、删除数据
cpp
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");
}
六、查询数据(需要处理结果集)
cpp
// 执行查询
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);
七、批量插入数据
cpp
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 库。