前言

        统信UOS无法在线安装mysql客户端的驱动包,需要到官网下载离线包进行安装配置。

离线安装包下载

https://dev.mysql.com/downloads/https://dev.mysql.com/downloads/

https://downloads.mysql.com/archives/c-c/https://downloads.mysql.com/archives/c-c/这个最后一张图片的连接,如果失效就按照上面的步骤逐步操作(本篇资源有这个包)。

安装mysql客户端

解压安装

解压后,只需要对include和lib目录进行操作

#在root用户权限下
#1.把include目录拷贝到/usr/include之下
cp -rf include /usr/include/mysql
#2.把lib目录下的libmysqlclient.so.18,拷贝到/usr/lib64/mysql/,并建一个软连接
mkdir /usr/lib64/mysql
cp lib/libmysqlclient.so.18 /usr/lib64/mysql/
cd /usr/lib64/mysql/
ln -s libmysqlclient.so libmysqlclient.so.18

如果不建立软连接,编译完程序之后,用ldd查看程序的动态库链接时,可能会提示:not found。

开发编译

gcc -g -o client   -I /usr/include/mysql mysqlc.c -L /usr/lib64/mysql -l mysqlclient

-I /usr/include/mysql  指头文件所在位置
-L /usr/lib64/mysql    指库文件所在位置
-l mysqlclient         使用库mysqlclient (库文件名是libmysqlclient.so,库文件名是库名前加lib,后加.so)

注意,以上编译之前需要设置下环境

export LD_LIBRARY_PATH=/usr/lib64/mysql:$LD_LIBRARY_PATH

如果不想设置环境,就把libmysqlclient.so拷贝一份到系统默认的库路径里面,比如统信UOS和麒麟的默认目录都是

/lib/x86_64-linux-gnu/

开发样例

查询语句样例

#include <mysql.h>
//mysql数据库信息
typedef struct  mysqldbMsg
{
    std::string db_ip;
    std::string db_name;
    std::string db_user;
    std::string db_pwd;
    mysqldbMsg(){
        db_ip="";
        db_name="";
        db_user="";
        db_pwd="";
    }
} stmysqldbMsg;

bool selecttable(stmysqldbMsg& st_sqldb){
    std::string numstr="0";
    char sqlstr[256]={0};
    sprintf(sqlstr,"SELECT COUNT(1) FROM mytable;",CputId.c_str());
    MYSQL mysql_conn; /* Connection handle */
    MYSQL_RES *mysql_result; /* Result handle */
    MYSQL_ROW mysql_row; /* Row data */
    //int /*f1, f2,*/ num_row=0, num_col=0;
    if (mysql_init(&mysql_conn) != NULL)
    {
        if (mysql_real_connect(&mysql_conn, st_sqldb.db_ip.c_str(), st_sqldb.db_user.c_str(), st_sqldb.db_pwd.c_str(), st_sqldb.db_name.c_str(), 3306, NULL, 0) != NULL)
        {
            //std::cout << __FUNCTION__ << " mysql_real_connect OK"  << std::endl;
        }
        else{
            std::cout << __FUNCTION__ << " mysql_real_connect fails"  << std::endl;
            return false;
        }
    }
    else
    {
        std::cout << __FUNCTION__ << " Initialization fails"  << std::endl;
        return false;
    }

    if (mysql_query(&mysql_conn, sqlstr) == 0)
    {
        /*  查询表中所有记录*/
        mysql_result = mysql_store_result(&mysql_conn); // get the result from the executing select query
        //num_row = mysql_num_rows(mysql_result); /* Get the no. of row */
        //num_col = mysql_num_fields(mysql_result); /* Get the no. of column */
        //printf("num_row [%d], num_col [%d]\n", num_row, num_col);
        mysql_row = mysql_fetch_row(mysql_result); /* Fetch one by one */
        numstr=mysql_row[0];
        std::cout << __LINE__ << " count num:" << numstr << std::endl;
        // for (f1 = 0; f1 < num_row; f1++)
        // {
        //     for (f2 = 0; f2 < num_col; f2++)
        //     {
        //         mysql_row = mysql_fetch_row(mysql_result); /* Fetch one by one */
        //         printf("[Row %d, Col %d] ==> [%s]\n", f1, f2, mysql_row[f2]);
        //     }
        // }
    }
    else{
        printf("Query fails\n");
    }
    mysql_free_result(mysql_result);
    mysql_close(&mysql_conn);

    if(numstr=="0") return false;

    return true;
}

执行语句样例

bool execsql(const char* sqlstr,stmysqldbMsg& st_sqldb){
    MYSQL mysql_conn; /* Connection handle */
    //MYSQL_RES *mysql_result; /* Result handle */
    if (mysql_init(&mysql_conn) != NULL)
    {
        if (mysql_real_connect(&mysql_conn, st_sqldb.db_ip.c_str(), st_sqldb.db_user.c_str(), st_sqldb.db_pwd.c_str(), st_sqldb.db_name.c_str(), 3306, NULL, 0) != NULL)
        {
            std::cout << __FUNCTION__ << " mysql_real_connect OK"  << std::endl;
        }
        else{
            std::cout << __FUNCTION__ << " mysql_real_connect fail"  << std::endl;
            return false;
        }
        // 设置字符集为 utf8mb4---有中文时,一定要加这一项设置,不然中文变成乱码
        if (mysql_set_character_set(&mysql_conn, "utf8mb4")) {
            std::cerr << "mysql_set_character_set() failed\n";
            mysql_close(&mysql_conn);
            return false;
        }
    }
    else
    {
        std::cout << __FUNCTION__ << " Initialization fails"  << std::endl;
        return false;
    }

    if (mysql_query(&mysql_conn, sqlstr) == 0)
    {
        //std::cout << __FUNCTION__ << " mysql_query OK:" << sqlstr << std::endl;
    }
    else{
        std::cout << __FUNCTION__ << " mysql_query fail:" << sqlstr  << std::endl;
    }
    //mysql_free_result(mysql_result);
    mysql_close(&mysql_conn);

    return true;
}

Makefile文件

CC        = g++
CFLAGS    =
DEBUGFLAG = -g -Wall
MACRO     =
#MACRO     = -D_DEBUG 
LIBDIRS   = -L./ -L /usr/lib64/mysql
LIBS      = -ldl -lmysqlclient
INCLUDE   = -I./ -I /usr/include/mysql   -I./lib   
MAKE_SO   = 
OPTIONS   = 
OBJDIR    =
SRCDIR    =
RUNOUTPUT = getdatabymysql
LIBOUTPUT =
OBJS      =  getdatabymysql.o 

default:$(RUNOUTPUT)


clean:
	rm -f $(OBJS) $(RUNOUTPUT)

install:
	cp -f $(RUNOUTPUT) ../../bin

$(RUNOUTPUT):$(OBJS)
	$(CC)   -o $(RUNOUTPUT) $^ $(OPTIONS)  $(LIBDIRS) $(LIBS)

.cpp.o:
	$(CC) $(DEBUGFLAG) $(MACRO) -fPIC -c $< -o $@ $(CFLAGS) $(INCLUDE)

更多推荐