当前位置: 首页 > news >正文

从零掌握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 常用端口

服务端口
MySQL3306
查看端口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库。

http://www.jsqmd.com/news/820790/

相关文章:

  • 2026年成都高度数配镜服务哪家强?权威榜单为你揭晓答案 - 品牌推荐官方
  • 国内专业砖雕厂家实力排行:工艺与交付能力盘点 - 奔跑123
  • Go语言命令行参数解析:从flag包原理到高级应用实践
  • OpenCore Legacy Patcher技术解析:为老旧Mac注入新生命的技术架构
  • 手把手教你用TwinCAT3配置松下A6伺服,打通Simulink Real-Time实时控制(含VS版本避坑指南)
  • 系统级跌落测试中封装焊点应力分析
  • Amlogic S905L3B芯片逆向工程实战:从零构建定制化Linux服务器
  • 2026重庆整装公司测评:从设计到交付,真实业主的避坑体验分享 - 大渝测评
  • Codeforces 1095 Div2(ABCDE)
  • 别再傻傻分不清了!WPF里Shape和Geometry到底该用哪个?实战避坑指南
  • LLM文本后处理实战:智能JSON提取与文本清洁流水线构建
  • LizzieYzy终极指南:如何利用开源围棋AI分析工具在3个月内提升段位
  • 2026年度东莞GEO优化服务商权威TOP5榜单:多维度全场景深度测评 - 元点智创
  • CSAPP Shell Lab通关秘籍:手把手教你用C语言实现一个带作业控制的简易Shell
  • 算法联盟·全域数学公理体系下黑洞标量毛发与LVK引力波O4全维理论、求导、证明、计算、验证、分析
  • 2026年度佛山GEO优化服务商权威TOP5榜单:多维度全场景深度测评 - 元点智创
  • 2026年成都GEO服务商公司推荐,TOP7权威排行榜全景解析 - 品牌推荐官方
  • 如何快速解锁WeMod完整功能:WandEnhancer终极使用指南
  • Arduino Blink项目详解:从LED闪烁入门嵌入式开发
  • 制造、零售、金融行业的企业即时通讯,为何对灵活扩展能力要求完全不同 - 小天互连即时通讯
  • 一致性Hash算法:如何实现分布式系统中的高效数据分片?
  • 2026年,你的企业为什么还不会用AI发稿?技术人深度拆解Infoseek媒体库
  • 思源宋体TTF中文版:7款字重一键解锁专业中文排版
  • 开封 CPPM 注册职业采购经理 河南正规报名入口 - 中供国培
  • 2026年度福州GEO优化服务商权威TOP5榜单:多维度全场景深度测评 - 元点智创
  • 电机选型与控制实战指南:从直流、步进到伺服电机
  • MemWeave:内存数据编织框架,高性能计算与复杂关系管理新思路
  • 【Linux网络编程】数据链路层
  • 学习笔记—MySQL—库表操作
  • 2026年5月权威实测:Claude Code必装的7个MCP,效率翻倍