本文为 MySQL 全栈入门实战教程覆盖从数据库基础概念、Ubuntu 环境下 MySQL 全流程安装、终端常用操作、用户权限管理、表的增删改查、局域网远程连接到 C 语言调用 MySQL API 进行业务开发的全流程内容。无论是零基础入门的同学还是嵌入式开发、后端开发需要快速上手 MySQL 的开发者都可以直接跟着本文一步步操作所有命令和代码均经过实测可直接复用。一、数据库基础概念1.1 什么是数据库数据库是按照数据结构来组织、存储和管理数据的仓库是长期存储在计算机内、有组织的、可共享的、统一管理的大量数据的集合核心作用就是对数据进行结构化管理支持核心的增、删、改、查四大操作。我们可以用生活中的例子做类比快速理解数据库的核心层级生活中的类比数据库中的对应概念核心作用文件夹数据库Database可以创建多个作为数据存储的顶层空间文件夹里的 Excel 表格表Table数据库内的核心存储单元类似表格有固定的列结构表格里的列 / 字段列Column/Field描述表所跟踪实体的属性有固定的数据类型和长度表格里的行数据行Row/Record表中存储的具体数据内容二、MySQL 数据库详解2.1 什么是 MySQLMySQL 是一款开放源代码的关系型数据库管理系统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执行以下命令shellsudo apt-get install mysql-server2.3.2 客户端安装如果需要通过代码 / 终端操作操控数据库必须安装客户端工具shellsudo apt-get install mysql-client2.3.3 开发包安装如果需要通过 C/C 等编程语言进行二次开发必须安装对应的开发依赖包shellsudo apt-get install libmysqlclient-dev2.3.4 网络工具安装后续需要检测数据库的网络监听状态需要安装 net-tools 网络工具包shellsudo apt install net-tools2.3.5 安装结果检测安装完成后通过以下命令检测 MySQL 是否正常启动并监听端口shellnetstat -tap | grep mysql如果输出中包含LISTEN状态的 mysql 相关记录说明安装成功服务已正常启动。2.3.6 数据库启停与状态管理MySQL 安装完成后可通过以下命令管理服务的启动、关闭、重启与状态查看启动数据库shellsudo service mysql start关闭数据库shellsudo service mysql stop查看数据库运行状态shellsudo service mysql status重启数据库shellsudo service mysql restart三、MySQL 终端操作全指南安装完成后我们可以通过终端直接操作 MySQL完成用户管理、数据库与表的全流程操作。3.1 登录与退出数据库3.1.1 登录数据库登录命令的标准格式如下shellmysql [-h host_name][-u user_name][-pyour_pass]参数说明-h host_name指定要登录的数据库主机 IP / 主机名不填默认是localhost本地-u user_name指定登录的用户名不填默认是 Unix 系统当前登录名-pyour_pass指定登录密码-p和密码之间无空格不填则会交互式提示输入密码。注意MySQL 初始安装后默认只有一个 root 用户初始无密码。推荐使用 root 用户进行操作避免普通用户权限不足的问题。最简本地登录命令root 用户shellsudo mysql -u root -p执行后输入密码初始无密码直接回车即可进入 MySQL 终端出现mysql提示符即为登录成功。3.1.2 退出数据库在 MySQL 终端中执行以下任意一个命令即可退出sql-- 方式1 \q -- 方式2 quit -- 方式3 exit3.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 创建用户命令格式sqlCREATE USER 用户名登录IP IDENTIFIED BY 密码;参数说明用户名要创建的账户名登录 IP指定该用户允许在哪个主机登录localhost代表仅本地登录%代表允许任意远程主机登录密码该用户的登录密码。示例创建一个允许任意主机登录的用户 L密码为 1sqlCREATE USER L% IDENTIFIED BY 1;3.4.2 查看所有用户执行以下命令可查看 MySQL 中已创建的所有用户及对应的登录 IPsql-- 方式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(新密码);示例修改用户 Llocalhost的密码为 123456sqlSET PASSWORD FOR Llocalhost PASSWORD(123456);3.4.4 给用户授权创建用户后默认只有登录权限需要手动授予数据库 / 表的操作权限命令格式sqlGRANT 权限1,权限2,... ON 数据库名.表名 TO 用户名登录IP;参数说明权限要授予的操作权限如 SELECT、INSERT、UPDATE、DELETE、CREATE、DROP 等授予所有权限用ALL数据库名。表名指定权限生效的范围*.*代表所有数据库的所有表test.*代表 test 数据库下的所有表。示例 1给用户 L% 授予 test 数据库 test 表的查询、插入权限sqlGRANT SELECT, INSERT ON test.test TO L%;示例 2给用户授予所有数据库所有表的所有权限sqlgrant all on *.* to 用户名% identified by 1234;3.4.5 撤销用户权限命令格式sqlREVOKE 权限 ON 数据库名.表名 FROM 用户名登录IP;示例撤销用户 pig% 对所有数据库的 SELECT 权限sqlREVOKE SELECT ON *.* FROM pig%;3.4.6 删除用户命令格式sqlDROP USER 用户名登录IP;示例删除用户 LlocalhostsqlDROP USER Llocalhost;3.5 数据库核心命令MySQL 的数据库命令大小写不敏感以下是最常用的 4 个核心操作。3.5.1 创建数据库sqlcreate database 数据库名;示例创建名为 work 的数据库sqlcreate database work;3.5.2 查看所有数据库sqlshow databases;执行后会列出 MySQL 实例中所有的数据库包括系统默认数据库和用户自建数据库。3.5.3 使用 / 切换数据库操作数据库和表之前必须先执行 use 命令指定要操作的数据库命令格式sqluse 数据库名;示例使用 work 数据库sqluse work;输出Database changed即为切换成功。3.5.4 删除数据库sqldrop database 数据库名;示例删除 work 数据库sqldrop database work;警告删除数据库会清空该库下所有的表和数据且无法恢复操作前务必确认3.6 MySQL 常用权限说明以下是 MySQL 最常用的操作权限以及对应的作用范围和功能表格权限命令作用上下文核心功能insert表向表中新增数据行update表更新表中已有的数据delete表删除表中的数据行alter表修改表的结构如新增 / 删除列、修改字段类型create数据库、表创建新的数据库或表drop数据库、表删除已有的数据库或表grant数据库、表将自身拥有的权限授予其他用户select表查询 / 查看表中的数据3.7 表的全操作增删改查表是数据存储的核心单元所有数据都存储在表中以下是表的全流程操作所有表操作前必须先通过 use 命令指定数据库。3.7.1 查看当前数据库的所有表sqlshow tables;3.7.2 创建表命令格式sqlcreate table 表名( 列名1 数据类型 [约束], 列名2 数据类型 [约束], ... );示例创建一个名为 test 的表包含 id整型、name字符串、sex字符串三个列sqlcreate table test( id int, name varchar(20), sex varchar(5) );3.7.3 查看表结构sqldesc 表名;示例查看 test 表的结构sqldesc test;执行后会输出表的字段名、数据类型、是否允许为空、键、默认值等信息。3.7.4 向表中写入数据增向表中插入数据使用 insert 命令有 3 种常用写法方式 1全列插入单行数据按表的列顺序给所有列赋值格式sqlinsert into 表名 values(值1,值2,值3,...);示例向 test 表插入一行数据sqlinsert into test values(1,张三,男);方式 2全列插入多行数据一次性插入多行数据逗号分隔每行数据格式sqlinsert into 表名 values(值1,值2,值3),(值4,值5,值6),...;示例向 test 表一次性插入两行数据sqlinsert into test values(2,李四,男),(3,王五,女);方式 3指定列插入数据只给指定的列赋值其他列默认为 NULL格式sqlinsert into 表名(列名1,列名2) values(值1,值2);示例只给 test 表的 name 和 id 列插入数据sqlinsert into test(name,id) values(赵六,4);3.7.5 查询表中数据查查询数据使用 select 命令是最常用的操作有 3 种常用写法方式 1查询表中所有数据sqlselect * from 表名;示例查询 test 表中所有数据sqlselect * from test;方式 2查询指定列的数据sqlselect 列名1,列名2 from 表名;示例只查询 test 表中的 id 和 name 列sqlselect id,name from test;方式 3按条件查询数据通过 where 子句指定查询条件格式sqlselect * from 表名 where 条件;示例 1查询 test 表中 sex 为 男 的所有数据sqlselect * from test where sex男;示例 2查询 test 表中 id2 且 name李四 的数据sqlselect * from test where id2 and name李四;示例 3查询 test 表中 sex 为 男 或 sex 为 女 的数据sqlselect * from test where sex男 or sex女;3.7.6 修改表中数据改修改数据使用 update 命令必须通过 where 子句指定修改条件否则会修改表中所有行的数据命令格式sqlupdate 表名 set 列1新值1,列2新值2,... where 条件;示例将 test 表中 id4 的行的 sex 修改为 女sqlupdate test set sex女 where id4;警告如果不写 where 条件update test set sex女;会将表中所有行的 sex 都改为 女务必谨慎3.7.7 删除表中数据行删删除数据行使用 delete 命令通过 where 子句指定删除条件不写条件会清空整张表命令格式sqldelete from 表名 where 条件;示例删除 test 表中 name赵六 且 id4 的行sqldelete from test where name赵六 and id4;警告delete from test;会删除表中所有数据仅保留表结构操作前务必确认3.7.8 删除表删除整张表包括表结构和所有数据命令格式sqldrop table 表名;示例删除 test 表sqldrop table test;3.8 中文乱码问题解决方案插入中文时可能会出现ERROR 1366 (HY000): Incorrect string value的报错这是因为 MySQL 默认字符集不是 utf8 导致的解决方案如下先删除之前创建的数据库旧库的字符集已固定修改不生效sqldrop database work;退出 MySQL 终端关闭 MySQL 服务shellsudo service mysql stop修改 MySQL 配置文件编辑 mysqld.cnf 文件shellsudo vim /etc/mysql/mysql.conf.d/mysqld.cnf在文件中添加以下配置inicharacter-set-serverutf8编辑 mysql.cnf 文件shellsudo vim /etc/mysql/conf.d/mysql.cnf在文件中添加以下配置inidefault-character-setutf8保存配置文件后启动 MySQL 服务shellsudo service mysql start重新进入 MySQL 终端创建新的数据库和表即可正常插入中文数据。3.9 MySQL 常用数据类型创建表时必须为每个列指定对应的数据类型以下是最常用的几类数据类型3.9.1 布尔类型类型说明bool存储真假值true/false底层用 TINYINT 实现3.9.2 字符类型类型说明CHAR(N)固定长度字符串正好 N 个字符不足则用空格填充最大限制 255VARCHAR(N)可变长度字符串最大 N 个字符节省存储空间最大限制 65535TINYTEXT短文本字符串最大长度 255 个字符MEDIUMTEXT中等长度文本最大长度 65535 个字符LONGTEXT长文本字符串最大长度 2^32-1 个字符3.9.3 整型类型类型存储空间TINYINT1 字节SMALLINT2 字节MEDIUMINT3 字节INT/INTEGER4 字节BIGINT8 字节3.9.4 浮点类型类型存储空间FLOAT4 字节DOUBLE8 字节3.9.5 时间类型类型存储空间格式说明DATE4 字节YYYY-MM-DD存储日期如 2026-04-08TIME3 字节HH:MM:SS存储时间如 15:30:00YEAR1 字节YYYY存储年份如 2026DATETIME8 字节YYYY-MM-DD HH:MM:SS存储日期 时间如 2026-04-08 15:30:00四、局域网跨主机连接 MySQL我们可以通过局域网在一台主机上连接另一台主机的 MySQL 数据库实现数据共享以下是全流程配置。4.1 被连接端服务端配置编辑 MySQL 配置文件放开网络监听限制shellsudo vim /etc/mysql/mysql.conf.d/mysqld.cnf找到bind-address配置项将其值改为*代表允许所有 IP 地址连接保存退出。重启 MySQL 服务使配置生效shellsudo service mysql restart创建用于远程连接的用户并授予权限root 用户默认不允许远程连接必须创建普通用户sql-- 创建允许任意IP登录的用户 CREATE USER remote_user% IDENTIFIED BY 123456; -- 授予所有权限 GRANT ALL ON *.* TO remote_user%; -- 刷新权限 FLUSH PRIVILEGES;4.2 主动连接端操作在另一台主机的终端中执行以下命令进行远程连接shellmysql -h 被连接主机的IP -P 端口号 -u 用户名 -p密码参数说明-h被连接主机的局域网 IP 地址-PMySQL 端口号大写 P默认 3306可省略-u远程连接的用户名服务端创建的 remote_user-p对应用户的密码和密码之间无空格。示例连接 IP 为 192.168.10.213 的主机 MySQL端口 3306用户 remote_user密码 123456shellmysql -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 库编译命令格式shellgcc 源文件.c -o 可执行文件名 -I /usr/include/mysql/ -lmysqlclient5.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 / 主机名本地为localhostuser登录的用户名passwd登录密码db要连接的数据库名NULL 则使用默认库portMySQL 端口号默认 3306unix_socketUnix 套接字默认 NULLclient_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 的代码包含数据库初始化连接、数据读取、数据写入、数据删除等功能可直接编译运行。#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、删除id2的数据 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执行编译命令shellgcc mysql_demo.c -o mysql_demo -I /usr/include/mysql/ -lmysqlclient运行可执行文件shell./mysql_demo结尾总结本文从零开始完整讲解了 MySQL 从基础概念、Ubuntu 环境安装、终端全操作、用户权限管理、表的增删改查、局域网远程连接到 C 语言 API 开发的全流程内容。MySQL 作为最主流的开源关系型数据库无论是后端开发、嵌入式开发、物联网开发都是必备的技能本文中的所有命令和代码都可以直接复用大家可以跟着一步步操作快速掌握 MySQL 的核心使用方法。本文为原创技术教程如需转载请注明出处有任何问题可以在评论区留言交流