【MySQL访问】

时间:2024-06-08 07:10:53

文章目录

  • 一、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。
具体连接方式请查阅其他文章。