本文为 MySQL 全栈入门实战教程,覆盖从数据库基础概念、Ubuntu 环境下 MySQL 全流程安装、终端常用操作、用户权限管理、表的增删改查、局域网远程连接,到 C 语言调用 MySQL API 进行业务开发的全流程内容。无论是零基础入门的同学,还是嵌入式开发、后端开发需要快速上手 MySQL 的开发者,都可以直接跟着本文一步步操作,所有命令和代码均经过实测,可直接复用。
一、数据库基础概念
1.1 什么是数据库
数据库是按照数据结构来组织、存储和管理数据的仓库 ,是长期存储在计算机内、有组织的、可共享的、统一管理的大量数据的集合,核心作用就是对数据进行结构化管理,支持核心的增、删、改、查四大操作。
我们可以用生活中的例子做类比,快速理解数据库的核心层级:
| 生活中的类比 | 数据库中的对应概念 | 核心作用 |
|---|---|---|
| 文件夹 | 数据库(Database) | 可以创建多个,作为数据存储的顶层空间 |
| 文件夹里的 Excel 表格 | 表(Table) | 数据库内的核心存储单元,类似表格,有固定的列结构 |
| 表格里的列 / 字段 | 列(Column/Field) | 描述表所跟踪实体的属性,有固定的数据类型和长度 |
| 表格里的行数据 | 行(Row/Record) | 表中存储的具体数据内容 |
二、MySQL 数据库详解
2.1 什么是 MySQL
MySQL 是一款开放源代码的关系型数据库管理系统(RDBMS),使用标准的结构化查询语言(SQL)进行数据库管理,基于 GPL 开源协议,任何人都可以免费下载、使用甚至修改源码定制个性化功能。凭借其高速、高可靠、高适配的特性,成为了业界最主流的数据库之一,尤其在不需要强事务化处理的场景下,是数据管理的最优选择之一。
2.2 MySQL 的核心优势
- 遵循标准 SQL 语言规范,学习成本低,通用型强;
- 支持超大型数据库,可处理上千万条记录,64 位系统最大支持 8TB 的表文件;
- 开源免费,基于 GPL 协议,无需支付额外费用,可定制化修改源码;
- 跨平台兼容,支持 Windows、Linux 等多系统,适配 C、C++、Python、Java、PHP 等几乎所有主流编程语言;
- 轻量高效,部署简单,运行稳定,资源占用低。
2.3 Ubuntu 环境下 MySQL 全流程安装
本文基于 Ubuntu 系统进行安装演示,所有命令均为 apt 包管理器命令,直接复制执行即可。
2.3.1 服务器端安装
作为数据存储的服务端,必须安装 mysql-server,执行以下命令:
shell
sudo apt-get install mysql-server
2.3.2 客户端安装
如果需要通过代码 / 终端操作操控数据库,必须安装客户端工具:
shell
sudo apt-get install mysql-client
2.3.3 开发包安装
如果需要通过 C/C++ 等编程语言进行二次开发,必须安装对应的开发依赖包:
shell
sudo apt-get install libmysqlclient-dev
2.3.4 网络工具安装
后续需要检测数据库的网络监听状态,需要安装 net-tools 网络工具包:
shell
sudo apt install net-tools
2.3.5 安装结果检测
安装完成后,通过以下命令检测 MySQL 是否正常启动并监听端口:
shell
netstat -tap | grep mysql
如果输出中包含LISTEN状态的 mysql 相关记录,说明安装成功,服务已正常启动。
2.3.6 数据库启停与状态管理
MySQL 安装完成后,可通过以下命令管理服务的启动、关闭、重启与状态查看:
- 启动数据库
shell
sudo service mysql start
- 关闭数据库
shell
sudo service mysql stop
- 查看数据库运行状态
shell
sudo service mysql status
- 重启数据库
shell
sudo service mysql restart
三、MySQL 终端操作全指南
安装完成后,我们可以通过终端直接操作 MySQL,完成用户管理、数据库与表的全流程操作。
3.1 登录与退出数据库
3.1.1 登录数据库
登录命令的标准格式如下:
shell
mysql [-h host_name][-u user_name][-pyour_pass]
参数说明:
-h host_name:指定要登录的数据库主机 IP / 主机名,不填默认是localhost(本地);-u user_name:指定登录的用户名,不填默认是 Unix 系统当前登录名;-pyour_pass:指定登录密码,-p和密码之间无空格,不填则会交互式提示输入密码。
注意:MySQL 初始安装后,默认只有一个 root 用户,初始无密码。推荐使用 root 用户进行操作,避免普通用户权限不足的问题。
最简本地登录命令(root 用户):
shell
sudo mysql -u root -p
执行后输入密码(初始无密码直接回车),即可进入 MySQL 终端,出现mysql>提示符即为登录成功。
3.1.2 退出数据库
在 MySQL 终端中,执行以下任意一个命令即可退出:
sql
-- 方式1
\q
-- 方式2
quit
-- 方式3
exit
3.2 帮助命令与提示符说明
3.2.1 帮助命令
在 MySQL 终端中,可通过以下命令查看帮助文档:
sql
-- 方式1
help;
-- 方式2
?
3.2.2 提示符说明
MySQL 终端中不同的提示符代表不同的状态,对应含义如下:
| 提示符 | 含义 | 说明 |
|---|---|---|
| mysql> | 准备好接受新命令 | 正常等待输入的提示符 |
| -> | 等待多行命令的下一行 | SQL 语句分多行输入,且未以分号结尾时的提示 |
| "> | 等待双引号闭合 | 已输入一个双引号,尚未输入配对的结束双引号 |
| '> | 等待单引号闭合 | 已输入一个单引号,尚未输入配对的结束单引号 |
| `> | 等待反引号闭合 | 已输入一个反引号,尚未输入配对的结束反引号 |
| /*> | 等待多行注释闭合 | 已输入注释起始符 /,尚未输入结束符/ |
3.3 核心名词解析
在操作前,先明确几个核心名词,避免混淆:
- 用户 :MySQL 的登录账户,分为 root 超级管理员和普通用户,与 Linux 系统用户相互独立; 补充:Linux 系统的 root 用户可以登录 MySQL 的任意用户,Linux 普通用户只能登录 MySQL 的普通用户。
- 数据库:数据存储的顶层空间,类比文件夹,一个 MySQL 实例可以创建多个数据库;
- 表:数据库内的核心存储单元,类比 Excel 表格,包含固定的列结构,用于存储具体的行数据;
- 列(字段):表中的属性列,每个列有固定的名称、数据类型和长度,类比 Excel 的表头列。
3.4 用户管理全操作
用户管理仅 root 超级管理员有权限操作,以下是全流程命令详解。
3.4.1 创建用户
命令格式:
sql
CREATE USER '用户名'@'登录IP' IDENTIFIED BY '密码';
参数说明:
- 用户名:要创建的账户名;
- 登录 IP:指定该用户允许在哪个主机登录,
localhost代表仅本地登录,%代表允许任意远程主机登录; - 密码:该用户的登录密码。
示例:创建一个允许任意主机登录的用户 L,密码为 1
sql
CREATE USER 'L'@'%' IDENTIFIED BY '1';
3.4.2 查看所有用户
执行以下命令,可查看 MySQL 中已创建的所有用户及对应的登录 IP:
sql
-- 方式1 格式化输出
SELECT DISTINCT CONCAT('User: ''',user,'''@''',host,''';') AS query FROM mysql.user;
-- 方式2 简洁输出
select user,host from mysql.user;
3.4.3 修改用户密码
命令格式:
sql
-- root修改指定用户密码
SET PASSWORD FOR '用户名'@'登录IP' = PASSWORD('新密码');
-- 当前登录用户修改自己的密码
SET PASSWORD = PASSWORD('新密码');
示例:修改用户 L@localhost的密码为 123456
sql
SET PASSWORD FOR 'L'@'localhost' = PASSWORD("123456");
3.4.4 给用户授权
创建用户后,默认只有登录权限,需要手动授予数据库 / 表的操作权限,命令格式:
sql
GRANT 权限1,权限2,... ON 数据库名.表名 TO '用户名'@'登录IP';
参数说明:
- 权限:要授予的操作权限,如 SELECT、INSERT、UPDATE、DELETE、CREATE、DROP 等,授予所有权限用
ALL; - 数据库名。表名:指定权限生效的范围,
*.*代表所有数据库的所有表,test.*代表 test 数据库下的所有表。
示例 1:给用户 L@% 授予 test 数据库 test 表的查询、插入权限
sql
GRANT SELECT, INSERT ON test.test TO 'L'@'%';
示例 2:给用户授予所有数据库所有表的所有权限
sql
grant all on *.* to '用户名'@"%" identified by "1234";
3.4.5 撤销用户权限
命令格式:
sql
REVOKE 权限 ON 数据库名.表名 FROM '用户名'@'登录IP';
示例:撤销用户 pig@% 对所有数据库的 SELECT 权限
sql
REVOKE SELECT ON *.* FROM 'pig'@'%';
3.4.6 删除用户
命令格式:
sql
DROP USER '用户名'@'登录IP';
示例:删除用户 L@localhost
sql
DROP USER 'L'@'localhost';
3.5 数据库核心命令
MySQL 的数据库命令大小写不敏感,以下是最常用的 4 个核心操作。
3.5.1 创建数据库
sql
create database 数据库名;
示例:创建名为 work 的数据库
sql
create database work;
3.5.2 查看所有数据库
sql
show databases;
执行后会列出 MySQL 实例中所有的数据库,包括系统默认数据库和用户自建数据库。
3.5.3 使用 / 切换数据库
操作数据库和表之前,必须先执行 use 命令指定要操作的数据库,命令格式:
sql
use 数据库名;
示例:使用 work 数据库
sql
use work;
输出Database changed即为切换成功。
3.5.4 删除数据库
sql
drop database 数据库名;
示例:删除 work 数据库
sql
drop database work;
警告:删除数据库会清空该库下所有的表和数据,且无法恢复,操作前务必确认!
3.6 MySQL 常用权限说明
以下是 MySQL 最常用的操作权限,以及对应的作用范围和功能:
表格
| 权限命令 | 作用上下文 | 核心功能 |
|---|---|---|
| insert | 表 | 向表中新增数据行 |
| update | 表 | 更新表中已有的数据 |
| delete | 表 | 删除表中的数据行 |
| alter | 表 | 修改表的结构(如新增 / 删除列、修改字段类型) |
| create | 数据库、表 | 创建新的数据库或表 |
| drop | 数据库、表 | 删除已有的数据库或表 |
| grant | 数据库、表 | 将自身拥有的权限授予其他用户 |
| select | 表 | 查询 / 查看表中的数据 |
3.7 表的全操作(增删改查)
表是数据存储的核心单元,所有数据都存储在表中,以下是表的全流程操作,所有表操作前必须先通过 use 命令指定数据库。
3.7.1 查看当前数据库的所有表
sql
show tables;
3.7.2 创建表
命令格式:
sql
create table 表名(
列名1 数据类型 [约束],
列名2 数据类型 [约束],
...
);
示例:创建一个名为 test 的表,包含 id(整型)、name(字符串)、sex(字符串)三个列
sql
create table test(
id int,
name varchar(20),
sex varchar(5)
);
3.7.3 查看表结构
sql
desc 表名;
示例:查看 test 表的结构
sql
desc test;
执行后会输出表的字段名、数据类型、是否允许为空、键、默认值等信息。
3.7.4 向表中写入数据(增)
向表中插入数据使用 insert 命令,有 3 种常用写法:
方式 1:全列插入单行数据按表的列顺序,给所有列赋值,格式:
sql
insert into 表名 values(值1,值2,值3,...);
示例:向 test 表插入一行数据
sql
insert into test values(1,"张三","男");
方式 2:全列插入多行数据一次性插入多行数据,逗号分隔每行数据,格式:
sql
insert into 表名 values(值1,值2,值3),(值4,值5,值6),...;
示例:向 test 表一次性插入两行数据
sql
insert into test values(2,"李四","男"),(3,"王五","女");
方式 3:指定列插入数据只给指定的列赋值,其他列默认为 NULL,格式:
sql
insert into 表名(列名1,列名2) values(值1,值2);
示例:只给 test 表的 name 和 id 列插入数据
sql
insert into test(name,id) values("赵六",4);
3.7.5 查询表中数据(查)
查询数据使用 select 命令,是最常用的操作,有 3 种常用写法:
方式 1:查询表中所有数据
sql
select * from 表名;
示例:查询 test 表中所有数据
sql
select * from test;
方式 2:查询指定列的数据
sql
select 列名1,列名2 from 表名;
示例:只查询 test 表中的 id 和 name 列
sql
select id,name from test;
方式 3:按条件查询数据通过 where 子句指定查询条件,格式:
sql
select * from 表名 where 条件;
示例 1:查询 test 表中 sex 为 "男" 的所有数据
sql
select * from test where sex="男";
示例 2:查询 test 表中 id=2 且 name="李四" 的数据
sql
select * from test where id=2 and name="李四";
示例 3:查询 test 表中 sex 为 "男" 或 sex 为 "女" 的数据
sql
select * from test where sex="男" or sex="女";
3.7.6 修改表中数据(改)
修改数据使用 update 命令,必须通过 where 子句指定修改条件,否则会修改表中所有行的数据!命令格式:
sql
update 表名 set 列1=新值1,列2=新值2,... where 条件;
示例:将 test 表中 id=4 的行的 sex 修改为 "女"
sql
update test set sex="女" where id=4;
警告:如果不写 where 条件,
update test set sex="女";会将表中所有行的 sex 都改为 "女",务必谨慎!
3.7.7 删除表中数据行(删)
删除数据行使用 delete 命令,通过 where 子句指定删除条件,不写条件会清空整张表!命令格式:
sql
delete from 表名 where 条件;
示例:删除 test 表中 name="赵六" 且 id=4 的行
sql
delete from test where name="赵六" and id=4;
警告:
delete from test;会删除表中所有数据,仅保留表结构,操作前务必确认!
3.7.8 删除表
删除整张表(包括表结构和所有数据),命令格式:
sql
drop table 表名;
示例:删除 test 表
sql
drop table test;
3.8 中文乱码问题解决方案
插入中文时,可能会出现ERROR 1366 (HY000): Incorrect string value的报错,这是因为 MySQL 默认字符集不是 utf8 导致的,解决方案如下:
- 先删除之前创建的数据库(旧库的字符集已固定,修改不生效)
sql
drop database work;
- 退出 MySQL 终端,关闭 MySQL 服务
shell
sudo service mysql stop
- 修改 MySQL 配置文件
- 编辑 mysqld.cnf 文件
shell
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
在文件中添加以下配置:
ini
character-set-server=utf8
- 编辑 mysql.cnf 文件
shell
sudo vim /etc/mysql/conf.d/mysql.cnf
在文件中添加以下配置:
ini
default-character-set=utf8
- 保存配置文件后,启动 MySQL 服务
shell
sudo service mysql start
- 重新进入 MySQL 终端,创建新的数据库和表,即可正常插入中文数据。
3.9 MySQL 常用数据类型
创建表时,必须为每个列指定对应的数据类型,以下是最常用的几类数据类型:
3.9.1 布尔类型
| 类型 | 说明 |
|---|---|
| bool | 存储真假值,true/false,底层用 TINYINT 实现 |
3.9.2 字符类型
| 类型 | 说明 |
|---|---|
| CHAR(N) | 固定长度字符串,正好 N 个字符,不足则用空格填充,最大限制 255 |
| VARCHAR(N) | 可变长度字符串,最大 N 个字符,节省存储空间,最大限制 65535 |
| TINYTEXT | 短文本字符串,最大长度 255 个字符 |
| MEDIUMTEXT | 中等长度文本,最大长度 65535 个字符 |
| LONGTEXT | 长文本字符串,最大长度 2^32-1 个字符 |
3.9.3 整型类型
| 类型 | 存储空间 |
|---|---|
| TINYINT | 1 字节 |
| SMALLINT | 2 字节 |
| MEDIUMINT | 3 字节 |
| INT/INTEGER | 4 字节 |
| BIGINT | 8 字节 |
3.9.4 浮点类型
| 类型 | 存储空间 |
|---|---|
| FLOAT | 4 字节 |
| DOUBLE | 8 字节 |
3.9.5 时间类型
| 类型 | 存储空间 | 格式 | 说明 |
|---|---|---|---|
| DATE | 4 字节 | YYYY-MM-DD | 存储日期,如 2026-04-08 |
| TIME | 3 字节 | HH:MM:SS | 存储时间,如 15:30:00 |
| YEAR | 1 字节 | YYYY | 存储年份,如 2026 |
| DATETIME | 8 字节 | YYYY-MM-DD HH:MM:SS | 存储日期 + 时间,如 2026-04-08 15:30:00 |
四、局域网跨主机连接 MySQL
我们可以通过局域网,在一台主机上连接另一台主机的 MySQL 数据库,实现数据共享,以下是全流程配置。
4.1 被连接端(服务端)配置
- 编辑 MySQL 配置文件,放开网络监听限制
shell
sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf
找到bind-address配置项,将其值改为*,代表允许所有 IP 地址连接,保存退出。
- 重启 MySQL 服务,使配置生效
shell
sudo service mysql restart
- 创建用于远程连接的用户,并授予权限(root 用户默认不允许远程连接,必须创建普通用户)
sql
-- 创建允许任意IP登录的用户
CREATE USER 'remote_user'@'%' IDENTIFIED BY '123456';
-- 授予所有权限
GRANT ALL ON *.* TO 'remote_user'@'%';
-- 刷新权限
FLUSH PRIVILEGES;
4.2 主动连接端操作
在另一台主机的终端中,执行以下命令进行远程连接:
shell
mysql -h 被连接主机的IP -P 端口号 -u 用户名 -p密码
参数说明:
-h:被连接主机的局域网 IP 地址;-P:MySQL 端口号,大写 P,默认 3306,可省略;-u:远程连接的用户名(服务端创建的 remote_user);-p:对应用户的密码,和密码之间无空格。
示例:连接 IP 为 192.168.10.213 的主机 MySQL,端口 3306,用户 remote_user,密码 123456
shell
mysql -h 192.168.10.213 -P 3306 -u remote_user -p123456
执行后即可成功连接到远程主机的 MySQL 数据库,后续操作和本地操作完全一致。
五、C 语言操作 MySQL API 全解析
MySQL 提供了完善的 C 语言 API,我们可以通过 C 代码实现数据库的连接、数据的增删改查等操作,以下是全流程详解。
5.1 开发环境与编译说明
- 必须提前安装开发包
libmysqlclient-dev; - 代码中必须包含头文件
#include <mysql/mysql.h>; - 编译代码时,必须指定头文件路径和链接 MySQL 库,编译命令格式:
shell
gcc 源文件.c -o 可执行文件名 -I /usr/include/mysql/ -lmysqlclient
5.2 核心 API 函数详解
以下是 C 语言操作 MySQL 最核心的 API 函数,按执行流程排序。
5.2.1 初始化连接结构体
MYSQL *mysql_init(MYSQL *mysql);
- 功能:初始化 MySQL 连接结构体,为后续连接做准备;
- 形参:传入 MYSQL 结构体的地址,若传入 NULL,会自动分配结构体空间;
- 返回值:成功返回初始化后的结构体地址,失败返回 NULL。
5.2.2 设置额外连接选项
int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg);
- 功能:设置连接的额外选项(如连接超时时间),必须在 mysql_init 之后、mysql_real_connect 之前调用;
- 形参:
- mysql:已初始化的 MYSQL 结构体指针;
- option:要设置的选项,如 MYSQL_OPT_CONNECT_TIMEOUT(连接超时时间);
- arg:选项对应的值;
- 返回值:成功返回 0,失败返回非 0。
5.2.3 连接数据库
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long client_flag);
- 功能:与 MySQL 数据库引擎建立连接,所有后续 API 操作都必须在连接成功后执行;
- 形参:
- mysql:已初始化的 MYSQL 结构体指针;
- host:数据库主机 IP / 主机名,本地为localhost;
- user:登录的用户名;
- passwd:登录密码;
- db:要连接的数据库名,NULL 则使用默认库;
- port:MySQL 端口号,默认 3306;
- unix_socket:Unix 套接字,默认 NULL;
- client_flag:连接标志,通常设为 0;
- 返回值:成功返回传入的结构体地址,失败返回 NULL。
5.2.4 设置字符集
int mysql_set_character_set(MYSQL *mysql, const char *csname);
- 功能:设置连接的字符集,避免中文乱码,通常设为 "utf8";
- 形参:
- mysql:已连接的 MYSQL 结构体指针;
- csname:字符集名称,如 "utf8";
- 返回值:成功返回 0,失败返回非 0。
5.2.5 执行 SQL 语句
int mysql_query(MYSQL *mysql, const char *query);
- 功能:执行 SQL 语句(增、删、改、查都通过该函数执行);
- 形参:
- mysql:已连接的 MYSQL 结构体指针;
- query:要执行的 SQL 语句字符串;
- 返回值:成功返回 0,失败返回非 0。
5.2.6 获取查询结果集
MYSQL_RES *mysql_store_result(MYSQL *mysql);
- 功能:将 select 查询的结果全部读取到客户端,存储在 MYSQL_RES 结果集结构体中;
- 形参:已连接的 MYSQL 结构体指针;
- 返回值:成功返回结果集地址,失败返回 NULL。
5.2.7 获取结果集的行数
my_ulonglong mysql_num_rows(MYSQL_RES *result);
- 功能:获取结果集中的行数量;
- 形参:mysql_store_result 返回的结果集指针;
- 返回值:结果集中的行数。
5.2.8 获取结果集的列数
unsigned int mysql_num_fields(MYSQL_RES *result);
- 功能:获取结果集中的列数量;
- 形参:mysql_store_result 返回的结果集指针;
- 返回值:结果集中的列数。
5.2.9 检索结果集的下一行
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
- 功能:逐行读取结果集中的数据,每次调用返回下一行的指针;
- 形参:mysql_store_result 返回的结果集指针;
- 返回值:成功返回下一行的 MYSQL_ROW 指针(字符串数组,每个元素对应一列的值),无更多行返回 NULL。
5.2.10 获取列的字段信息
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *result);
- 功能:获取结果集中列的字段信息(如字段名、所属表名等);
- 形参:mysql_store_result 返回的结果集指针;
- 返回值:成功返回当前列的 MYSQL_FIELD 结构体指针,无更多列返回 NULL。
5.2.11 释放结果集内存
void mysql_free_result(MYSQL_RES *result);
- 功能:释放结果集占用的内存,查询完成后必须调用,避免内存泄漏;
- 形参:mysql_store_result 返回的结果集指针;
- 返回值:无。
5.2.12 获取错误信息
const char* mysql_error(MYSQL* mysql);
- 功能:获取最近一次 MySQL API 调用失败的错误信息;
- 形参:MYSQL 结构体指针;
- 返回值:错误信息字符串。
5.2.13 关闭数据库连接
void mysql_close(MYSQL *mysql);
- 功能:关闭数据库连接,释放相关资源,程序结束前必须调用;
- 形参:MYSQL 结构体指针;
- 返回值:无。
5.3 完整实战代码示例
以下是完整的 C 语言操作 MySQL 的代码,包含数据库初始化连接、数据读取、数据写入、数据删除等功能,可直接编译运行。
cpp
#include <stdio.h>
#include <stdlib.h>
#include <mysql/mysql.h>
// 全局变量定义
MYSQL my_connect;
MYSQL_ROW sqlrow;
int iTableRow, iTableCol; // 结果集的行数、列数
// 数据库初始化与连接
int mysql_init_connect(void)
{
unsigned int timeout = 10; // 连接超时时间10秒
MYSQL *my_ptr = NULL;
// 1、初始化MySQL结构体
my_ptr = mysql_init(&my_connect);
if (NULL == my_ptr)
{
perror("mysql init failed");
goto ERR;
}
// 2、设置连接超时选项
if (mysql_options(&my_connect, MYSQL_OPT_CONNECT_TIMEOUT, (char *)&timeout) != 0)
{
perror("mysql options set failed");
goto ERR;
}
// 3、连接数据库 请根据实际情况修改IP、用户名、密码、数据库名、端口
my_ptr = mysql_real_connect(&my_connect, "192.168.10.213", "remote_user", "123456", "work", 3306, NULL, 0);
if (NULL == my_ptr)
{
perror("mysql connect failed");
goto ERR;
}
// 4、设置字符集为utf8,避免中文乱码
mysql_set_character_set(&my_connect, "utf8");
printf("mysql connect success!\n");
return 0;
ERR:
// 打印错误信息
printf("mysql error: %s\n", mysql_error(&my_connect));
// 关闭连接
mysql_close(&my_connect);
return -1;
}
// 读取表中所有数据
int mysql_read_data(void)
{
// 执行select查询语句
if (mysql_query(&my_connect, "select * from test;") != 0)
{
perror("mysql query select failed");
return -1;
}
// 获取结果集
MYSQL_RES *res_ptr = mysql_store_result(&my_connect);
if (NULL == res_ptr)
{
perror("mysql store result failed");
return -1;
}
// 获取结果集的行数和列数
iTableRow = mysql_num_rows(res_ptr);
iTableCol = mysql_num_fields(res_ptr);
printf("查询到 %d 行,%d 列\n", iTableRow, iTableCol);
// 获取字段名并打印
MYSQL_FIELD *field = mysql_fetch_field(res_ptr);
printf("字段名:");
for (int i = 0; i < iTableCol; i++)
{
printf("%-8s", (field + i)->name);
}
printf("\n");
// 逐行读取并打印数据
for (int i = 0; i < iTableRow; i++)
{
sqlrow = mysql_fetch_row(res_ptr);
for (int j = 0; j < iTableCol; j++)
{
printf("%-8s", sqlrow[j] ? sqlrow[j] : "NULL");
}
printf("\n");
}
// 释放结果集内存
mysql_free_result(res_ptr);
return 0;
}
// 向表中写入数据
int mysql_write_data(const char *name, int id, const char *sex)
{
char sql_buffer[100] = {0};
// 拼接insert SQL语句
sprintf(sql_buffer, "insert into test values(%d, '%s', '%s');", id, name, sex);
// 执行SQL语句
if (mysql_query(&my_connect, sql_buffer) != 0)
{
perror("mysql query insert failed");
printf("error: %s\n", mysql_error(&my_connect));
return -1;
}
printf("数据插入成功!\n");
return 0;
}
// 删除表中指定数据
int mysql_delete_data(int id)
{
char sql_buffer[100] = {0};
// 拼接delete SQL语句
sprintf(sql_buffer, "delete from test where id=%d;", id);
// 执行SQL语句
if (mysql_query(&my_connect, sql_buffer) != 0)
{
perror("mysql query delete failed");
printf("error: %s\n", mysql_error(&my_connect));
return -1;
}
printf("数据删除成功!\n");
return 0;
}
// 主函数
int main(int argc, char *argv[])
{
// 1、初始化并连接数据库
if (mysql_init_connect() != 0)
{
return -1;
}
// 2、插入数据
mysql_write_data("张三", 1, "男");
mysql_write_data("李四", 2, "男");
mysql_write_data("王五", 3, "女");
// 3、读取并打印所有数据
printf("\n===== 插入数据后查询结果 =====\n");
mysql_read_data();
// 4、删除id=2的数据
mysql_delete_data(2);
// 5、再次读取并打印数据
printf("\n===== 删除数据后查询结果 =====\n");
mysql_read_data();
// 6、关闭数据库连接
mysql_close(&my_connect);
printf("\nmysql connect closed\n");
return 0;
}
编译与运行:
- 将代码保存为
mysql_demo.c; - 执行编译命令:
shell
gcc mysql_demo.c -o mysql_demo -I /usr/include/mysql/ -lmysqlclient
- 运行可执行文件:
shell
./mysql_demo
结尾总结
本文从零开始,完整讲解了 MySQL 从基础概念、Ubuntu 环境安装、终端全操作、用户权限管理、表的增删改查、局域网远程连接,到 C 语言 API 开发的全流程内容。MySQL 作为最主流的开源关系型数据库,无论是后端开发、嵌入式开发、物联网开发,都是必备的技能,本文中的所有命令和代码都可以直接复用,大家可以跟着一步步操作,快速掌握 MySQL 的核心使用方法。
本文为原创技术教程,如需转载请注明出处,有任何问题可以在评论区留言交流~