开发者

MySQL使用C语言连接完整代码样例

开发者 https://www.devze.com 2025-03-23 12:08 出处:网络 作者: Zfox_
目录一:mysql connectConnector / C 使用mysql 接口介绍完整代码样例总结一:MySQL connect
目录
  • 一:mysql connect
    • Connector / C 使用
    • mysql 接口介绍
    • 完整代码样例
  • 总结

    一:MySQL connect

    MySQL 的基础,我们之前已经学过,后面我们只关心使用

    要使用 C 语言连接 MySQL,需要使用 MySQL 官网提供的库,大家可以去官网下载

    我们使用 C接口库来进行连接

    要正确使用,我们需要做一些准备工作:

    • 保证 mysql 服务有效
    • 在官网上下载合适自己平台的 MySQL connect 库,以备后用
    • 建议直接使用命令 sudo yum install -y mysql-community-server 安装

    Connector / C 使用

    • 我们下下来的库格式如下:
    # tree /usr/include/mysql
    /usr/include/mysql
    ├── client_plugin.h
    ├── errmsg.h
    ├── field_types.h
    ├── my_command.h
    ├── my_compress.h
    ├── my_list.h
    ├── mysql_com.h
    ├── mysqld_error.h
    ├── mysql.h
    ├── mysql_time.h
    ├── mysql_version.h
    ├── mysqlx_ername.h
    ├── mysqlx_error.h
    ├── mysqlx_version.h
    ├── plugin_auth_common.h
    └── udf_registration_types.h
    
    lib
    # find /usr -name "libmysqlclient*"
    /usr/share/doc/libmysqlclient21
    /usr/share/doc/libmysqlclient-dev
    /usr/lib/x86_64-linux-gnu/libmysqlclient.so.21.2.40
    /usr/lib/x86_64-linux-gnu/libmysqlclient.a
    /usr/lib/x86_64-linux-gnu/libmysqlclient.so
    /usr/lib/x86_64-linux-gnu/libmysqlclient.so.21
    

    其中 include 包含所有的方法声明, lib 包含所有的方法实现(打包成库)

    尝试链接 mysql client

    通过 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 mytest test.cc -std=c++11 -lmysqlclient
    $ ls
    Makefile  mytest  test.cc
    
    $ ./mytest 
    mysql client version: 8.0.40
    

    至此引入库的工作已经做完,接下来就是熟悉接口

    mysql 接口介绍

    MySQL官方文档借口介绍

    MySQL使用C语言连接完整代码样例

    初始化 mysql_init()

    要使用库,必须先进行初始化!

    初始化一个 MYSQL对象 
    MYSQL *mysql_init(MYSQL编程客栈 *mysql);
    
    使用 mysql_init函数初始化一个 MySQL 连接句柄,为后续操作做准备。
    如: MYSQL *mfp = mysql_init(NULL)
    

    链接数据库 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);
    
    //建立好链接之后,获取英文没有问题,如果获取中文是乱码:
    //设置链接的默认字符集是utf8,原始默认是latin1
    mysql_set_character_set(myfd, "utf8");
    

    第一个参数 MYSQL是 C api 中一个非常重要的对象(mysql_init的返回值),里面内存非常丰富,有

    port, dbname, charset 等连接基本参数。它也包含了一个叫 st_mysql_methods 的结构体变量,该变量里面保存着很多函数指针,这些函数指针将会在数据库连接成功以后的各种数据操作中被调用。

    mysql_real_connect 函数中各参数,基本都是顾名思意。

    测试:

    #include <iostream>
    #include <unistd.h>
    #include <string>
    #include <mysql/mysql.h>
    
    const std::string host = "127.0.0.1";
    const std::string user = "connector";
    const std::string passwd = "123456";
    const std::string db = "conn";
    const unsigned int port = 3306;
    
    int main()
    {
        std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;
    
        MYSQL* my = mysql_init(nullptr);
        if(my == nullptr)
        {
            std::cerr << "init MySQL error" << std::endl;
            return 1;
        }
    
        if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
        {
            std::cerjsr << "connect MYSQL error" << std::endl;
            return 2;
        }
    
        std::cout << "connect success" <&http://www.devze.comlt; std::endl;
    
        mysql_set_character_set(my, "utf8");    // 设置字符集
        
    	mysql_close(my);
    
        return 0;
    }
    

    结果:

    # ./mytest 
    mysql client version: 8.0.40
    connect success
    

    下发 mysql 命令 mysql_query

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

    第一个参数上面已经介绍过,第二个参数为要执行的sql语句,如&l编程客栈dquo;select * from table”。

    获取执行结果 mysql_store_result sql 执行完以后,如果是查询语句,我们当然还要读取数据,如果 update,insert 等语句,那么就看下操作成功与否即可。

    #include <iostream>
    #include <unistd.h>
    #include <string>
    #include <mysql/mysql.h>
    const std::string host = "127.0.0.1";
    const std::string user = "connector";
    const std::string passwd = "123456";
    const std::string db = "conn";
    const unsigned int port = 3306;
    int main()
    {
        std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;
        MYSQL* my = mysql_init(nullptr);
        if(my == nullptr)
        {
            std::cerr << "init MySQL error" << std::endl;
            return 1;
        }
        if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
        {
            std::cerr << "connect MYSQL error" << std::endl;
            return 2;
        }
        std::cout << "connect success" << std::endl;
        mysql_set_character_set(my, "utf8");    // 设置字符集
    	std::string sql;
        while(true)
        {
            std::cout << "MySQL>>> ";
            if(!std::getline(std::cin, sql) || sql == "quit") 
            {
                std::cout << "bye bye" << std::endl;
                break;
            }
            int n = mysql_query(my, sql.c_str());
            if(n == 0)
            {
                std::cout << sql << " success: " << n << std::endl;
            }
            else
            {
                std::cerr << sql << " failed" << n << std::endl;
            }
        } 
    	mysql_close(my);
        return 0;
    }

    我们来看看如何获取查询结果: 如果 mysql_query 返回成功,那么我们就通过 mysql_store_result 这个函数来读取结果。原型如下:

    MYSQL_RES *mysql_store_result(MYSQL *mysql);
    

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

    获取结果行数 mysql_num_rows

    获取结果列数 mysql_num_fields

    获取列名 mysql_fetch_fields

    如:

    	int fields = mysql_num_fields(res);
    	MYSQL_FIELD *field = mysql_fetch_fields(res);
    	for(int i = 0; i < fields; i++)
    	{
    		cout<<field[i].name<<" ";
    	} 
    

    获取结果内容mysql_fetch_row

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

    	MYSQL_ROW line;
    	for(i = 0; i < nums; i++)
    	{
    		line = mysql_fetch_row(res);
    		for(int j = 0; j < fields; j++)
    		{
    			cout << line[j] << " ";
    		} 
    	}
    

    完整代码样例

    #include <iostream>
    #include <unistd.h>
    #include <string>
    #include <mysql/mysql.h>
    
    const std::string host = "127.0.0.1";
    const std::string user = "connector";
    const std::string passwd = "123456";
    const std::string db = "conn";
    const unsigned int port = 3306;
    
    int main()
    {
        std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;
    
        MYSQL* my = mysql_init(nullptr);
        if(my == nullptr)
        {
            std::cerr << "init MySQL error" << std::endl;
            return 1;
        }
    
        if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
        {
            std::cerr << "connect MYSQL error" << std::endl;
            return 2;
        }
    
        std::cout << "connect success" << std::endl;
    
        mysql_set_character_set(my, "utf8");    // 设置字符集
    
        //std::string sql = "update user set name='Jimmy' where id=2";
        //std::string sql = "insert into user (name, age, telphone) values ('peter', 19, 6543219876)";
        std::string sql = "select * from user";
        int n = mysql_query(my, sql.c_str());
        if(n == 0)  std::cout << sql << " success" << std::endl;
        else 
        {
            std::cerr << sql << " failed" << std::endl;
            return 3;
        }
    
        MYSQL_RES *res = mysql_store_randroidesult(my);
        if(res == nullptr)
        {
            std::cerr << "mysql_store_result error" << std::endl;
            return 4;
        }
    
        my_ulonglong rows = mysql_num_rows(res);
        my_ulonglong fields = mysql_num_fields(res);
    
        std::cout << "行: " << rows << std::endl;
        std::cout << "列: " << fields << std::endl;
    
        // 属性
        MYSQL_FIELD *fields_array = mysql_fetch_fields(res);
        for(int i = 0; i < fields; i++)
        {
            std::cout << fields_array[i].name << '\t';
        }
        std::cout << '\n';
    
        // 内容
        for(int i = 0; i < rows; i++)
        {
            MYSQL_ROW row = mysql_fetch_row(res);       // mysql_fetch_row相当于一个迭代器,会自动向后遍历  MYSQL_ROW 就是一个 char** 的二级指针
            for(int j = 0; j < fields; j++)
            {
                std::cout << row[j] << '\t';
            }
            std::cout << '\n';
        }
    
        mysql_free_result(res);
    
        mysql_close(my);
    
        return 0;
    }
    

    关闭 mysql 链接 mysql_close

    void mysql_close(MYSQL *sock);
    

    另外,mysql C api 还支持事务等常用操作,大家下来自行了解:

    my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode);
    my_bool STDCALL mysql_commit(MYSQL * mysql);
    my_bool STDCALL mysql_rollback(MYSQL * mysql);
    

    或者直接通过query函数直接操作都可以

    总结

    到此这篇关于MySQL使用C语言连接的文章就介绍到这了,更多相关MySQL使用C语言连接内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!

    0

    精彩评论

    暂无评论...
    验证码 换一张
    取 消

    关注公众号