• MySQL -- mysql connect


    MySQL – mysql connect


    使用C接口库来进行连接

    一、Connector/C 使用

    1.环境安装

    可以去MySQL官网下载Connector/C,并在服务器上安装;
    在这里插入图片描述
    安装好之后,可以查看mysql的库文件
    在这里插入图片描述

    2.尝试链接mysql client

    通过mysql_get_client_info() 函数,来验证我们的引入是否成功;

    #include 
    #include 
    int main()
    {
    printf("mysql client Version: %s\n", mysql_get_client_info());
    return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    makefile:
    在这里插入图片描述
    由于MySQL是外部库,需要指定编译选项;

    运行结果:
    在这里插入图片描述

    二、MySQL接口

    1.初始化

    初始化mysql_init()
    要使用库,必须先进行初始化!
    函数参数:

    MYSQL *mysql_init(MYSQL *mysql);
    
    • 1

    函数使用:

    MYSQL *mfp = mysql_init(NULL);
    
    • 1

    2.链接数据库

    链接数据库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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    第一个参数 MYSQL是 C api中一个非常重要的变量(mysql_init的返回值),里面内存非常丰富,有port,dbname,charset等连接基本参数。它也包含了一个叫 st_mysql_methods的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。
    mysql_real_connect函数中各参数,基本都是顾名思意。

    建立好链接之后,获取英文没有问题,如果获取中文是乱码:
    设置链接的默认字符集是utf8,原始默认是latinl

    mysql_set_character_set(myfd, "utf8");
    
    • 1

    3.下发mysql命令

    下发mysql命令mysql_query
    函数参数:

    int mysql_query(MYSQL *mysql, const char *q);
    
    • 1

    第二个参数为要执行的sql语句,如“select * from table”。

    4.获取执行结果

    获取执行结果mysql_store_result
    sql执行完以后,如果是查询语句,我们当然还要读取数据,如果update,insert等语句,那么就看下操作成功与否即可。我们来看看如何获取查询结果: 如果mysql_query返回成功,那么我们就通过mysql_store_result这个函数来读取结果。原型如下:

    MYSQL_RES *mysql_store_result(MYSQL *mysql);
    
    • 1

    该函数会调用MYSQL变量中的t_mysql_methods中的 read_rows 函数指针来获取查询的结果。同时该函数会返回MYSQL_RES 这样一个变量,该变量主要用于保存查询的结果。同时该函数malloc了一片内存空间来存储查询过来的数据,所以我们一定要记的 free(result),不然是肯定会造成内存泄漏的。 执行完mysql_store_result以后,其实数据都已经在MYSQL_RES 变量中了,下面的api基本就是读取MYSQL_RES 中的数据。

    获取结果行数mysql_num_rows

    my_ulonglong mysql_num_rows(MYSQL_RES *res);
    
    • 1

    获取结果列数mysql_num_fields

    unsigned int mysql_num_fields(MYSQL_RES *res);
    
    • 1

    获取列名mysql_fetch_fields

    MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
    
    • 1

    例如:

    int fields = mysql_num_fields(res);
    MYSQL_FIELD *field = mysql_fetch_fields(res);
    int i = 0;
    for(; i < fields; i++){
    cout<<field[i].name<<" ";
    }
    cout<<endl;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    获取结果内容mysql_fetch_row

    MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);
    
    • 1

    它会返回一个MYSQL_ROW变量,**MYSQL_ROW其实就是char .就当成一个二维数组来用吧。

    i = 0;
    MYSQL_ROW line;
    for(; i < nums; i++){
    line = mysql_fetch_row(res);
    int j = 0;
    for(; j < fields; j++){
    cout<<line[j]<<" ";
    }
    cout<<endl;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    5.关闭mysql链接

    关闭mysql链接mysql_close

    void mysql_close(MYSQL *sock);
    
    • 1

    6.在C语言中连接MySQL

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    
    string host = "127.0.0.1"; //'localhost'
    string user = "whb";
    string passwd = "123456";
    string db = "104_105_db";
    unsigned int port = 8080;
    
    int main()
    {
        // cout << "mysql client version: " << mysql_get_client_info() << endl;
        // 0. 初始化mysql对象
        MYSQL *msql = mysql_init(nullptr);
        if (msql == nullptr)
        {
            cerr << "mysql_init error" << endl;
            exit(1);
        }
        // 1. 登陆认证
        if (mysql_real_connect(msql, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
        {
            cerr << "mysql_real_connect error" << endl;
            exit(2);
        }
        mysql_set_character_set(msql, "utf8"); // 设置连接编码
        cout << "mysql_real_connect success" << endl;
    
        // string sql = "insert into emp values (666, '张飞', 789.987)";  //编码不一致会导致乱码
        // string delSql = "delete from emp where id=666";
        // string updateSql = "update emp set name='赵云' where id=666";
        // string selectSql = "select * from emp";
        char sql[1024];
        while (true)
        {
            printf("mysql> ");
            fgets(sql, sizeof sql, stdin); //'    select  * from user   ' 
    
            // 调用成功的时候,返回值是0, 否则就是1
            int n = mysql_query(msql, sql);
            if (strcasestr(sql, "select") && n == 0)
            {
                cout << "result: " << n << endl;
                // 对结果进行解析
                MYSQL_RES *res = mysql_store_result(msql);
                if (res == nullptr)
                    exit(0);
                int rows = mysql_num_rows(res);
                int fields = mysql_num_fields(res);
    
                MYSQL_FIELD *fname = mysql_fetch_fields(res);
    
                for (int j = 0; j < fields; j++)
                    cout << fname[j].name << "\t|\t";
                cout << endl;
    
                MYSQL_ROW line;
                for (int i = 0; i < rows; i++)
                {
                    line = mysql_fetch_row(res); // 按行获取文件的内容,自动会更新行数
                    for (int j = 0; j < fields; j++)
                        cout << line[j] << "\t|\t";
                    cout << endl;
                }
    
                printf("%d rows in set\n", rows);
            }
            else
            {
                cout << "execl sql : " << sql << " done" << endl;
            }
        }
        // 关闭mysql对象
        mysql_close(msql);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82

    三、MySQL图形化界面推荐

    在这里插入图片描述
    在这里插入图片描述

  • 相关阅读:
    vue中跨域 和 axios的封装
    CTF--Web安全--SQL注入之Post-Union注入
    单元测试是什么?怎么写?主要测试什么?
    【Docker】Docker入门安装指南2022 (Windows版)
    Redis面试---缓存问题
    【算法笔记】单源最短路问题——Dijkstra算法(无优化/优先队列/set优化)
    在学习编程的过程中,我会记录下以下内容:
    【ACWing】273. 分级(配数学证明)
    职称评审的业绩要求,余老师为人才讲讲都需要符合什么条件的业绩
    【Unity Android】Unity链接安卓手机调试
  • 原文地址:https://blog.csdn.net/kissland96166/article/details/134322080