文章目录
- 一、C++远程连接到MySQL
- mysql_init()函数
- mysql_real_connect()函数
- 实战案例
- 二、处理查询select的细节
- mysql_store_result()函数
- 获取结果行和列
- 获取select结果
- 获取行内容
- 获取列属性
- 三、MySQL图形化界面连接
关于动态链接,请看这篇文章:
动静态库
一、C++远程连接到MySQL
前言:这里我在连接时遇到了一个问题,在/usr/include/目录下,找不到mysql目录,意味着我想用的头文件无法找到,上网查了发现问题是没有安装mysql的开发包,所以去安装了mysql的开发包:
sudo yum install mysql-devel;
就解决了这个问题。
mysql_init()函数
MYSQL *mysql_init(MYSQL *mysql);
案例:
MYSQL *msq = mysql_init(nullptr);
mysql_real_connect()函数
初始化完毕之后,必须先链接数据库,在进行后续操作。(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是 C api中一个非常重要的变量(mysql_init的返回值),里面内存非常丰富,有port,dbname,charset等连接基本参数。它也包含了一个叫 st_mysql_methods的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。
mysql_real_connect函数中各参数,基本都是顾名思意。
注意:建立好链接之后,获取英文没有问题,如果获取中文是乱码:
设置链接的默认字符集是utf8,原始默认是latin1
mysql_set_character_set(myfd, “utf8”);
像这里就出现了乱码问题。
总结:所有的乱码问题,都是因为客户端和服务器的字符编码没有保持一致。
实战案例
const std::string host = "127.0.0.1";
const std::string user = "dzt";
const std::string passwd = "137183";
const std::string db = "rootDB";
const unsigned int port = 8080;
int main()
{
// 初始化mysql服务器
MYSQL *msq = mysql_init(nullptr);
if (msq == nullptr)
{
std::cerr << "init mysql error" << std::endl;
return 1;
}
mysql_set_character_set(msq, "utf8"); // 设置默认字符集为utf8,而不是默认的latin1
// 连接到mysql服务器
if (mysql_real_connect(msq, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
{
std::cerr << "connect to mysql fail!" << std::endl;
return 1;
}
else
{
std::cout << "connect to mysql success!! " << std::endl;
}
//让指令能调动mysql
std::string sql; //不能加const,否则传参时传进getline参数类型不匹配
while(1)
{
std::cout << "mysql> ";
if(!(std::getline(std::cin,sql)) || sql == "quit")//输入的sql语句为空 || 为quit
{
std::cout << "bye" << std::endl;
break;
}
//正式输入sql语句,增删查改
int n = mysql_query(msq, sql.c_str()); //向msq数据库对象下发指令
if(n == 0) //成功
{
std::cout << "success" << std::endl;
}
else
{
std::cerr << "fail" << std::endl;
}
}
mysql_close(msq);
return 0;
}
二、处理查询select的细节
mysql_store_result()函数
MYSQL_RES *mysql_store_result(MYSQL *mysql);
该函数处理select这类查询语句,再合适不过了。
MYSQL_RES是一个对象,主要用来保存查询的结果。
可以按下面的方式理解:
把MYSQL)RES看成一个char**的数组,每个数组都存储着char*[] 一维数组的地址。
所有查询出来的结果,都看成字符串保存再这些数组中。
获取结果行和列
获取行数
my_ulonglong mysql_num_rows(MYSQL_RES *res);
获取列数
unsigned int mysql_num_fields(MYSQL_RES *res);
获取select结果
根据上面的二维数组列表图,首先要获取行,才能获取列。
上面已经获取了行数和列数,现在则只需要依次获取每一行的内容即可。(即获取每一行的数组)
获取行内容
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
案例:
int rows = mysql_num_rows(res); //获取行数
int fields = mysql_num_fields(res); //获取列数
std::cout << "行:" << rows << " 列:" << fields << std::endl;
for(int i = 0;i < rows;i++)
{
//打印一行的内容
MYSQL_ROW row = mysql_fetch_row(res); //获取res对象中的结果
for(int j = 0;j < fields;j++)
{
std::cout << row[j] <<" ";
}
std::cout << std::endl;
}
获取列属性
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
//获取列属性数组,这个列属性是一个结构体对象,有许多成员
//数组每个成员都是一个对象
MYSQL_FIELD* fields_array = mysql_fetch_fields(res);
for(int i = 0;i < fields;i++)
{
std::cout << fields_array[i].name << " ";
}
std::cout << std::endl;
列属性和行内容联动,就获取到了完整的属性名+数据了。
三、MySQL图形化界面连接
推荐使用 navicat 和SQLyog。
具体连接方式请查阅其他文章。