从零掌握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

第二部分:数据库基本概念

一、什么是数据库

二、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 库。

相关推荐
czlczl200209251 小时前
Mysql JOIN 的物理执行流程
数据库·mysql
Java面试题总结1 小时前
MySQL 反模式与排查宝典
数据库·mysql
STARFALL0011 小时前
MySQL 运维
运维·数据库·mysql
XD7429716361 小时前
科技早报晚报|2026年5月14日:数据库沙箱、文档解析与 GPU 共享,今天更值得做成产品的 3 个技术机会
数据库·科技·开源项目·开发者工具·ai基础设施
祀爱1 小时前
ASP.NET Core 集成NLog详细教程
数据库·后端·asp.net
醇氧1 小时前
CentOS 7 安装 MySQL 8.0.28 el7 (完美兼容 OpenSSL 1.1)
linux·mysql·centos
java修仙传1 小时前
Java 实习日记:一次 Excel 导入校验 Bug 的定位与数据更新逻辑优化
java·数据库·bug·excel·后端开发
wa的一声哭了1 小时前
Mit6.s081 Interrupts and device driver(中断和设备驱动)
linux·服务器·arm开发·数据库·python·gpt·算法
码界筑梦坊1 小时前
117-基于Python的印度犯罪数据可视化分析系统
开发语言·python·mysql·信息可视化·毕业设计·echarts·fastapi