赞
踩
「前言」文章内容大致是使用C语言连接MySQL。
「归属专栏」MySQL
「主页链接」个人主页
「笔者」枫叶先生(fy)
按照前面MySQL的安装流程,安装完MySQL,MySQL相应的连接相关的库也被下载下来了
查看动态库是否存在
ls /lib64/mysql/
查看MySQL相应的头文件是否存在
ls /usr/include/mysql
如果不存在,需要安装一下
yum install -y mysql-devel
下面先通过调用mysql_get_client_info
来判断库是否引入成功,该函数的作用就是获取客户端的版本信息
#include <iostream>
#include <mysql/mysql.h>
int main()
{
std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;
return 0;
}
进行编译
g++ -o mysql mysql.cpp -L/lib64/mysql -lmysqlclient
-L
:用于指定库文件的搜索路径-l
:用于指明需要连接库文件路径下的哪一个库(L的小写)这些在动静态库那里都讲过了,不再解释
运行可执行程序后,可以看到客户端的版本号
至此库已经成功被引入,接下来就是库函数的使用了
1、初始化
在连接数据库之前,需要先创建一个MySQL对象,进行初始化
该函数如下:
MYSQL* mysql_init(MYSQL *mysql);
说明:
mysql_init
将自动分配一个MYSQL
对象(句柄)并返回MYSQL
对象,该函数会对该对象进行初始化MYSQL
是一个结构体,定义如下:
2、连接数据库
初始化完毕之后,必须先链接数据库,才能进行后续操作(mysql网络部分是基于TCP/IP的)
连接数据库的函数如下:
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 clientflag);
参数说明:
mysql
:表示在连接数据库前,调用mysql_init
函数创建的MYSQL
对象host
:表示需要连接的MySQL服务器的IP地址,"127.0.0.1"表示连接本地MySQL服务器user
:表示连接MySQL服务器时,登录所使用的用户名passwd
:表示连接MySQL服务器时,登录所使用用户的密码db
:表示连接MySQL服务器后,需要使用的是哪一个数据库MySQL
服务器,所对应的端口号unix_socket
:表示连接时应该使用的套接字或命名管道,通常设置为NULLclientflag
:可以设置为多个标志位的组合,表示允许特定的功能,通常设置为0返回值
MYSQL
对象(句柄),该对象与第一个参数mysql
相同3、关闭数据库连接
与数据库交互完毕后,需要关闭数据库连接
关闭数据库连接的函数如下:
void mysql_close(MYSQL *sock);
说明:
sock
,就是连接数据库前调用mysql_init
创建的MySQL对象,传入该对象即可连接测试
代码如下:
#include <iostream> #include <string> #include <mysql/mysql.h> using namespace std; const string host = "127.0.0.1"; const string user = "fengye"; const string password = "123123aa"; const string db = "test_db"; const int port = 3306; int main() { // 1.初始化 MYSQL* my = mysql_init(nullptr); // 2.连接数据库 if(mysql_real_connect(my, host.c_str(), user.c_str(), password.c_str(), db.c_str(), port, nullptr, 0) == nullptr) { cerr << "数据库连接失败!" << endl; return 1; } cout << "连接成功" << endl; // 3.关闭连接 mysql_close(my); return 0; }
进行编译运行,数据库连接成功
数据库连接成功了,就可以进行进行发送SQL请求了
设置编码格式
在连接数据库之后,需要统一客户端和服务器的编码格式,避免在数据交互过程中出现乱码,设置编码格式的函数如下:
int mysql_set_character_set(MYSQL *mysql, const char *csname);
说明:
mysql
:是mysql_init
函数创建初始化的MYSQL
对象csname
:表示要设置的编码格式,如"utf8"返回值:为0表示设置成功,否则表示设置失败
注:设置链接原始默认字符集是latin1
发送SQL请求
下发SQL请求的函数如下:
int mysql_query(MYSQL *mysql, const char *q);
说明:
mysql
:是mysql_init
函数创建初始化的MYSQL
对象返回值:为0表示SQL执行成功,否则表示SQL执行失败
向数据库中插入数据
#include <iostream> #include <string> #include <mysql/mysql.h> using namespace std; const string host = "127.0.0.1"; const string user = "fengye"; const string password = "123123aa"; const string db = "test_db"; const int port = 3306; int main() { // 1.初始化 MYSQL* my = mysql_init(nullptr); // 2.连接数据库 if(mysql_real_connect(my, host.c_str(), user.c_str(), password.c_str(), db.c_str(), port, nullptr, 0) == nullptr) { cerr << "数据库连接失败!" << endl; return 1; } cout << "连接成功" << endl; // 设置编码格式 mysql_set_character_set(my, "utf8"); string sql = "insert into user (name, age) values ('王五', 19);"; if(mysql_query(my, sql.c_str()) != 0) { cerr << sql << " failed." << endl; return 2; } cout << sql << " sucsess." << endl; // 3.关闭连接 mysql_close(my); return 0; }
编译运行
删除数据库中的数据
进行删除数据测试
编译运行
修改数据库中的数据
进行修改数据库数据测试
编译运行
获取查询结果的函数如下:
MYSQL_RES* mysql_store_result(MYSQL *mysql);
注:
MYSQL_RES
变量中MYSQL_RES
是一个结构体,定义如下:
释放结果集函数:
void mysql_free_result(MYSQL_RES *result);
说明:参数传入结果集即可
获取结果集成功后,需要获取结果集的行数和列数,方便进行遍历数据
获取查询结果的行数
获取查询结果的行数的函数如下:
my_ulonglong mysql_num_rows(MYSQL_RES *res);
获取查询结果的列数
获取查询结果的列数的函数如下:
unsigned int mysql_num_fields(MYSQL_RES *res);
获取查询结果中的一行数据
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
注:
获取列名
获取查询结果的列属性的函数如下:
MYSQL_FIELD* mysql_fetch_fields(MYSQL_RES *res);
注:
MYSQL_FIELD
对象中保存着对应列的各种列属性MYSQL_FIELD
结构体定义如下:
遍历结果集类似于遍历二维数组
查询演示
#include <iostream> #include <string> #include <mysql/mysql.h> using namespace std; const string host = "127.0.0.1"; const string user = "fengye"; const string password = "123123aa"; const string db = "test_db"; const int port = 3306; int main() { // 1.初始化 MYSQL* my = mysql_init(nullptr); // 2.连接数据库 if(mysql_real_connect(my, host.c_str(), user.c_str(), password.c_str(), db.c_str(), port, nullptr, 0) == nullptr) { cerr << "数据库连接失败!" << endl; return 1; } cout << "连接成功" << endl; // 设置编码格式 mysql_set_character_set(my, "utf8"); // string sql = "insert into user (name, age) values ('王五', 19);"; // string sql = "delete from user where id=4"; // string sql = "update user set age=66 where id=1"; string sql = "select * from user"; if(mysql_query(my, sql.c_str()) != 0) { cerr << sql << " failed." << endl; return 2; } cout << sql << " sucsess." << endl; // 获取结果集 MYSQL_RES* res = mysql_store_result(my); int row = mysql_num_rows(res); // 数据行数 int col = mysql_num_fields(res); // 数据列数 // 获取每列的属性,并打印 MYSQL_FIELD* fields = mysql_fetch_field(res); for(int i = 0; i < col; ++i) { cout << fields[i].name << "\t"; } cout << endl; // 遍历数据 for(int i = 0; i < row; ++i) { // 获取每一行 MYSQL_ROW rows = mysql_fetch_row(res); for(int j = 0; j < col; ++j) { cout << rows[j] << "\t"; } cout << endl; } // 释放res mysql_free_result(res); // 3.关闭连接 mysql_close(my); return 0; }
编译运行,数据成功被获取出来
char**
的指针mysql_fetch_row
函数获取一行,返回的结果实际是char**,char**又指向一个char*的数组「 作者 」 枫叶先生
「 更新 」 2023.9.14
「 声明 」 余之才疏学浅,故所撰文疏漏难免,
或有谬误或不准确之处,敬请读者批评指正。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。