1、方法
想要用C语言连接MySQL,需要使用MySQL官网提供的库。
可以下载官方的库,然后传到Linux上。
也可以直接在Linux上,下载MySQL的开发工具包,即客户端开发包:
bash
sudo apt-get install libmysqlclient-dev
随后只要在 /usr/include/mysql/ 下出现了 <mysql.h>这个头文件即可:
bash
yangz@yangz-virtual-machine:~/MyHome$ ll /usr/include/mysql/
-rw-r--r-- 1 root root 33601 9月 18 18:08 mysql.h
或者找到mysqlclient库也行:
bash
yangz@yangz-virtual-machine:~/MyHome$ find / -name libmysqlclient.so*
/usr/lib/libmysqlclient.so
/usr/lib/x86_64-linux-gnu/libmysqlclient.so
/usr/lib/x86_64-linux-gnu/libmysqlclient.so.21.2.40
/usr/lib/x86_64-linux-gnu/libmysqlclient.so.2
之后使用的时候,需要在Makefile文件里连接mysqlclient库:
bash
-L /usr/lib/x86_64-linux-gnu -lmysqlclient
2、MySQL接口介绍
接下来全部使用C语言进行连接,更接近底层。
C++的话,就是对C进行了一通封装,然后创建对象进行操作。
2.1、初始化 mysql_init
要使用数据库,必须先进行初始化:
cpp
MYSQL *ms = mysql_init(nullptr); // MYSQL* 就相当于FILE*、fd等 -> 统称为句柄
if (ms == nullptr)
{
std::cerr << "init MySQL error" << std::endl;
return 1;
}
2.2、连接数据库 mysql_real_connect
cpp
const std::string host = "127.0.0.1"; // 也可以写localhost,就是本地环回
const std::string user = "username";
const std::string passwd = "password";
const std::string db = "conn";
const unsigned int port = 8080; // 看配置文件里面设置的port
ms = mysql_real_connect(ms, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0);
if (ms == nullptr)
{
std::cerr << "connect MySQL error" << std::endl;
return 2;
}
std::cout << "connect MySQL success" << std::endl;
2.3、设置连接的字符集编码 mysql_set_character_set
cpp
mysql_set_character_set(ms, "utf8mb4");
2.4、下达sql语句指令 mysql_query
bash
int mysql_query(MYSQL *mysql, const char *q);
其中const char* q:就是要下达的sq指令:
cpp
std::string sql;
while (true)
{
std::cout << "MySQL>>> ";
if (!std::getline(std::cin, sql) || sql == "quit")
{
std::cout << "bye" << std::endl;
break;
}
int n = mysql_query(ms, sql.c_str());
if (n == 0)
std::cout << sql << " success , n : " << n << std::endl;
else
std::cerr << sql << " error , n : " << n << std::endl;
}
2.5、获取select查询结果
cpp
std::string sql = "select * from user;"; // 先select
int n = mysql_query(ms, sql.c_str());
if (n == 0)
std::cout << sql << " success , n : " << n << std::endl;
else
std::cerr << sql << " error , n : " << n << std::endl;
MYSQL_RES *msr = mysql_store_result(ms); // 再将select的结果转储到MYSQL_RES
if (msr == nullptr)
{
std::cerr << "mysql_store_result error " << std::endl;
return 3;
}
my_ulonglong rows = mysql_num_rows(msr); // 行数
my_ulonglong fields = mysql_num_fields(msr); // 列数
std::cout << "行: " << rows << " , 列 : " << fields << std::endl;
MYSQL_FIELD *msr_fields = mysql_fetch_field(msr); // 获取列名
for (size_t i = 0; i < fields; i++)
std::cout << msr_fields[i].name << "\t";
std::cout << "\n";
MYSQL_ROW row; // 获取msr这个"二维数组"的一行,逐次往后获取
for (size_t i = 0; i < rows; i++)
{
row = mysql_fetch_row(msr); // mysql_fetch_row 就类似于一个迭代器,自动向后获取
for (size_t j = 0; j < fields; j++)
std::cout << row[j] << "\t";
std::cout << "\n";
}
mysql_free_result(msr); // 释放msr
2.6、关闭
cpp
mysql_close(ms);
2.7、完整流程
cpp
#include <iostream>
#include <string>
#include <mysql/mysql.h>
int main()
{
// std::cout << "mysql client version : " << mysql_get_client_info() << std::endl;
// 1. 初始化
MYSQL *ms = mysql_init(nullptr); // MYSQL* 就相当于FILE*、fd等 -> 统称为句柄
if (ms == nullptr)
{
std::cerr << "init MySQL error" << std::endl;
return 1;
}
// 2.连接数据库
const std::string host = "127.0.0.1"; // 也可以写localhost,就是本地环回
const std::string user = "username";
const std::string passwd = "password";
const std::string db = "conn";
const unsigned int port = 8080; // 看配置文件里面设置的port
ms = mysql_real_connect(ms, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0);
if (ms == nullptr)
{
std::cerr << "connect MySQL error" << std::endl;
return 2;
}
std::cout << "connect MySQL success" << std::endl;
// 3.设置链接字符集
mysql_set_character_set(ms, "utf8mb4");
// 4.查询
std::string sql = "select * from user;"; // 先select
int n = mysql_query(ms, sql.c_str());
if (n == 0)
std::cout << sql << " success , n : " << n << std::endl;
else
std::cerr << sql << " error , n : " << n << std::endl;
MYSQL_RES *msr = mysql_store_result(ms); // 再将select的结果转储到MYSQL_RES
if (msr == nullptr)
{
std::cerr << "mysql_store_result error " << std::endl;
return 3;
}
my_ulonglong rows = mysql_num_rows(msr); // 行数
my_ulonglong fields = mysql_num_fields(msr); // 列数
std::cout << "行: " << rows << " , 列 : " << fields << std::endl;
MYSQL_FIELD *msr_fields = mysql_fetch_field(msr); // 获取列名
for (size_t i = 0; i < fields; i++)
std::cout << msr_fields[i].name << "\t";
std::cout << "\n";
MYSQL_ROW row; // 获取msr这个"二维数组"的一行,逐次往后获取
for (size_t i = 0; i < rows; i++)
{
row = mysql_fetch_row(msr); // mysql_fetch_row 就类似于一个迭代器,自动向后获取
for (size_t j = 0; j < fields; j++)
std::cout << row[j] << "\t";
std::cout << "\n";
}
mysql_free_result(msr); // 释放msr
// // 3.下达sql指令
// std::string sql;
// while (true)
// {
// std::cout << "MySQL>>> ";
// if (!std::getline(std::cin, sql) || sql == "quit")
// {
// std::cout << "bye" << std::endl;
// break;
// }
// int n = mysql_query(ms, sql.c_str());
// if (n == 0)
// std::cout << sql << " success , n : " << n << std::endl;
// else
// std::cerr << sql << " error , n : " << n << std::endl;
// }
// end. 关闭
mysql_close(ms);
return 0;
}