C语言操作MySQL数据库:从环境搭建到实战案例
在后端开发与嵌入式开发领域,C语言结合MySQL数据库能高效实现数据的存储与管理。想要用C语言操作MySQL,核心是借助libmysqlclient-dev开发包提供的API接口,完成从环境搭建、数据库连接到数据增删改查的全流程操作。
一、环境搭建:打好操作基础
想要用C语言操作MySQL,第一步要完成服务端、客户端及开发包的安装部署,确保开发环境完整可用。
-
安装MySQL服务端与客户端
-
在Ubuntu系统中,可通过命令
sudo apt-get install mysql-server完成安装。需要注意的是,Ubuntu18.04版本安装过程中不会弹出密码输入提示,这和Windows系统的安装流程有区别。 -
安装MySQL开发包
-
开发包
libmysqlclient-dev是C语言操作MySQL的关键,它提供了所需的API接口。安装命令为sudo apt-get install libmysqlclient-dev。如果编译时提示找不到mysql.h头文件,可尝试安装libmysqld-dev解决问题。 -
验证安装结果
-
输入
sudo netstat -tap | grep mysql命令,若能看到mysqld进程处于监听状态,就说明MySQL服务已经成功启动。
二、MySQL登录与密码配置
安装完成后,需要通过客户端登录MySQL,同时为了保证数据库安全,还需正确配置root账户密码。
-
基础登录操作
-
使用
sudo mysql -u root -p命令可以登录MySQL。在Ubuntu系统中,该命令可绕过密码直接登录,这是系统的默认特性。 -
root密码修改步骤
-
首先执行
sudo cat /etc/mysql/debian.cnf命令,查看系统默认生成的账户和密码;接着使用该账户登录MySQL,执行use mysql命令切换到mysql数据库;然后运行update mysql.user set authentication_string=password('新密码') where user='root';和update user set plugin="mysql_native_password";命令修改密码并配置认证插件;之后执行flush privileges;刷新权限,最后退出并重启MySQL服务。 -
密码策略问题解决
-
若修改密码时出现
ERROR 1819错误,说明密码不符合安全策略要求。可执行set global validate_password_policy=0;命令降低策略要求,同时设置密码长度不少于8位。
三、C语言操作MySQL核心流程
C语言操作MySQL的核心是调用libmysqlclient-dev提供的API函数,遵循"初始化-连接-执行SQL-处理结果-释放资源"的流程。
-
准备测试数据
-
先通过MySQL客户端创建测试环境,执行
create database ljs;命令创建数据库,use ljs;命令切换数据库,create table stu( id int,name varchar(20) );命令创建数据表,再用insert into stu (id,name) values(1,"ljs");命令插入测试数据。 -
关键API函数解析
- 初始化连接 :
mysql_init()函数用于初始化MYSQL结构体,它是所有操作的基础。传入NULL时,函数会自动分配并初始化结构体。 - 建立连接 :
mysql_real_connect()函数负责连接数据库,需要传入主机地址、用户名、密码、数据库名、端口等参数。连接成功后返回有效的MYSQL句柄,失败则返回NULL。 - 执行SQL语句 :
mysql_real_query()函数用于执行SQL语句,支持插入、删除、查询等所有操作,执行成功返回0。 - 处理查询结果 :
mysql_store_result()函数用于获取查询结果集,搭配mysql_fetch_row()函数可逐行读取数据,mysql_num_fields()函数能获取结果集的列数。 - 释放资源 :操作完成后,需调用
mysql_free_result()释放结果集内存,使用mysql_close()关闭数据库连接。
- 初始化连接 :
-
字符集设置
-
当操作中文数据时,需调用
mysql_set_character_set(mysql,"utf8");函数设置字符集,避免出现中文乱码问题。
四、实战案例:实现数据插入与查询
以下是一个完整的C语言操作MySQL的案例,实现了数据插入和查询功能。
C
#include<stdio.h>
#include<mysql/mysql.h>
#include<string.h>
int main()
{
MYSQL *mysql = mysql_init(NULL);
// 连接数据库
if(NULL == mysql_real_connect(mysql,"localhost","root","123456","ljs",3306,NULL,0))
{
fprintf(stderr, "连接失败: %s\n", mysql_error(&mysql));
return -1;
}
printf("连接成功\n");
char sql_str[200] = {0};
// 执行插入操作
sprintf(sql_str,"insert into stu(id,name) values (20,'wzz')");
mysql_real_query(mysql,sql_str,strlen(sql_str));
memset(sql_str,0,200);
// 执行查询操作
sprintf(sql_str,"select * from stu");
mysql_real_query(mysql,sql_str,strlen(sql_str));
// 处理查询结果
MYSQL_RES *result = mysql_store_result(mysql);
unsigned int fieldnum = mysql_num_fields(result);
MYSQL_ROW rows;
printf("表内容显示为:\n");
while(rows = mysql_fetch_row(result))
{
for(int i=0; i < fieldnum; i++)
{
printf("%12s",rows[i]);
}
printf("\n");
}
// 释放资源
mysql_free_result(result);
mysql_close(mysql);
return 0;
}
编译并运行该程序的命令为sudo gcc test_mysql.c -lmysqlclient -o test_mysql,执行./test_mysql即可看到查询结果。
五、总结
C语言操作MySQL的关键在于熟练掌握libmysqlclient-dev的API函数,遵循规范的开发流程。在实际开发中,要注意编译时链接mysqlclient库,操作中文数据时设置正确的字符集,使用完资源后及时释放,避免内存泄漏。通过以上步骤,就能高效地实现C语言与MySQL数据库的交互。