• LinuxC++操作mysql数据库(#include <mysql/mysql.h>的使用)


    mysql

    安装

    1.安装mysql c++库

    sudo apt-get install libmysql++-dev
    sudo systemctl mysql-server
    
    • 1
    • 2

    2.安装mysql

    sudo apt-get install mysql-server
    sudo apt-get install mysql-client
    systemctl status mysql.service #请检是否安装成功
    
    • 1
    • 2
    • 3

    mysql安装
    sql语句

    使用

    • 进入mysql
    sudo mysql -u root -p
    
    • 1
    • 创建数据库
    CREATE TABLE `users`(
        `use` VARCHAR(50) NOT NULL COMMENT 'id',
        `pwd` VARCHAR(50) NOT NULL COMMENT 'passwd',
        PRIMARY KEY (`use`)
    )ENGINE=INNODB DEFAULT CHARSET=utf8
    
    INSERT INTO `users`(`use`,`pwd`) VALUES ('aa' , 'bb'),('cc','dd');
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 常用操作
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    using namespace std;
    
    int main()
    {
        MYSQL *con = NULL;
        con = mysql_init(con);//初始化
    
        if (con == NULL)
        {
            cout << "MySQL Error1";
        }
        string url = "localhost";    //主机地址
        unsigned int Port = 3306;   //数据库端口号
        string User = "root";   //登陆数据库用户名
        string PassWord = "123456";  //登陆数据库密码
        string DBName = "test_databace"; //使用数据库名
        //链接数据库
        con = mysql_real_connect(con, url.c_str(), User.c_str(), PassWord.c_str(), DBName.c_str(), Port, NULL, 0);
    
        if (con == NULL)
        {
            cout << "MySQL Error2";
        }
        //执行sql语句,如果查询成功,mysql_query()函数会返回0;否则,返回非零值表示发生错误。
        mysql_query(con , "INSERT INTO `users`(`use`,`pwd`) VALUES ('add' , 'bbb');");
        mysql_query(con,"select * from users");
    
        MYSQL_RES *res;
        MYSQL_ROW row;
        //获得执行结果
        res = mysql_use_result(con);
        const char * csname = "utf8";
        mysql_set_character_set(con, csname);
    
        //获取字段个数,即查询获得的结果里有几列数据
        int nums = 0;  
        nums = mysql_num_fields(res);  //属于表结构的获取
        cout << nums << endl;
    
        MYSQL_FIELD * fields;
        fields = mysql_fetch_fields(res);  //属于表结构的获取
        for(int i = 0; i < nums ; i++)
        {
            cout<<fields[i].name<<"|";
        }
        cout<<endl;
    
        while( (row = mysql_fetch_row(res)) != nullptr)  //mysql_fetch_row()函数从指定的结果集中获取一行数据返回给row,是数组的形式,即row内部是字符串数组指针(二级指针)
        {
            for(int i = 0; i < nums; i++)
            {
                cout<<row[i]<<"|" ;
            }
            cout << endl;
        }
    
        mysql_free_result(res);
        mysql_close(con);
    }
    
    • 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
    • MYSQL_FILED
    typedef struct MYSQL_FIELD {
      /* 列名 */
      char *name;
    
      /* 列的原始名称,如果该列是别名 */
      char *org_name;
    
      /* 如果列是一个字段,则为该字段所在表的名称 */
      char *table;
    
      /* 表的原始名称,如果表是别名 */
      char *org_table;
    
      /* 表所在的数据库名称 */
      char *db;
    
      /* 表所在的目录(在某些数据库系统中使用) */
      char *catalog;
    
      /* 字段的默认值,由mysql_list_fields设置 */
      char *def;
    
      /* 列的宽度(创建时定义的长度) */
      unsigned long length;
    
      /* 所选数据集中列的最大宽度 */
      unsigned long max_length;
    
      /* 列名的长度 */
      unsigned int name_length;
    
      /* 原始列名的长度 */
      unsigned int org_name_length;
    
      /* 表名的长度 */
      unsigned int table_length;
    
      /* 原始表名的长度 */
      unsigned int org_table_length;
    
      /* 数据库名称的长度 */
      unsigned int db_length;
    
      /* 目录名称的长度 */
      unsigned int catalog_length;
    
      /* 默认值的长度 */
      unsigned int def_length;
    
      /* 分区标志位 */
      unsigned int flags;
    
      /* 小数点后的位数,用于表示数字类型的精度 */
      unsigned int decimals;
    
      /* 字符集编号 */
      unsigned int charsetnr;
    
      /* 字段类型,枚举类型,具体类型参照mysql_com.h中的定义 */
      enum enum_field_types type;
    
      /* 扩展字段,可以用于实现特定扩展功能 */
      void *extension;
    } MYSQL_FIELD;
    
    • 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
    • 编译
    g++ $(mysql_config --cflags) main.cpp -o main $(mysql_config --libs)
    
    • 1
    • cmake
    set(CMAKE_CXX_FLAGS "-I/usr/include/mysql")
    add_executable(main main.cpp)
    target_link_libraries(main -L/usr/lib/x86_64-linux-gnu -lmysqlclient -lzstd -lssl -lcrypto -lresolv -lm)
    
    • 1
    • 2
    • 3

    数据结构

    • MYSQL
    typedef struct MYSQL {
      /* 存储通信参数的结构体,包含网络连接细节 */
      NET net;
    
      /* SSL连接使用的文件描述符指针 */
      unsigned char *connector_fd;
    
      /* 数据库服务器地址字符串指针 */
      char *host;
      
      /* 数据库用户名字符串指针 */
      char *user;
    
      /* 密码字符串指针 */
      char *passwd;
    
      /* Unix域套接字路径字符串指针 */
      char *unix_socket;
    
      /* 服务器版本信息字符串指针 */
      char *server_version;
    
      /* 主机附加信息字符串指针 */
      char *host_info;
    
      /* 连接额外信息字符串指针 */
      char *info;
    
      /* 当前选中的数据库名称字符串指针 */
      char *db;
    
      /* 当前连接的字符集信息结构体指针 */
      struct CHARSET_INFO *charset;
    
      /* 查询结果字段数组指针 */
      MYSQL_FIELD *fields;
    
      /* 用于存储查询结果字段分配的内存管理器结构体 */
      struct MEM_ROOT *field_alloc;
    
      /* 受影响的行数 */
      uint64_t affected_rows;
    
      /* 最后一次插入操作生成的自动增长ID */
      uint64_t insert_id;
    
      /* 未使用的信息字段 */
      uint64_t extra_info;
    
      /* 服务端为该连接分配的线程ID */
      unsigned long thread_id;
    
      /* 数据包长度 */
      unsigned long packet_length;
    
      /* 数据库服务器端口 */
      unsigned int port;
    
      /* 客户端标志位,记录客户端特性 */
      unsigned long client_flag;
    
      /* 服务器能力标志位,记录服务器支持的功能 */
      unsigned long server_capabilities;
    
      /* 协议版本号 */
      unsigned int protocol_version;
    
      /* 查询结果字段数量 */
      unsigned int field_count;
    
      /* 服务器状态标志 */
      unsigned int server_status;
    
      /* 服务器语言设置 */
      unsigned int server_language;
    
      /* 警告计数 */
      unsigned int warning_count;
    
      /* MySQL连接选项结构体 */
      struct st_mysql_options options;
    
      /* 连接当前状态(如已连接、断开等) */
      enum mysql_status status;
    
      /* 结果集元数据获取方式 */
      enum enum_resultset_metadata resultset_metadata;
    
      /* 标记是否在mysql_close时释放此连接资源 */
      bool free_me;
    
      /* 标记是否启用自动重连功能 */
      bool reconnect;
    
      /* 会话级随机字符串,用于身份验证 */
      char scramble[SCRAMBLE_LENGTH + 1];
    
      /* 包含所有声明过的SQL语句的链表 */
      LIST *stmts;
    
      /* 指向一组用于与MySQL交互的方法的结构体 */
      const struct MYSQL_METHODS *methods;
    
      /* 指向MySQL服务器内部线程对象的指针 */
      void *thd;
    
      /* 指向一个布尔标志,用于指示结果集或语句的所有者是否取消了结果集 */
      bool *unbuffered_fetch_owner;
    
      /* 扩展字段,可以用于实现特定扩展功能 */
      void *extension;
    } MYSQL;
    
    • 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
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111
    • 112
    • MYSQL_RES
    typedef struct MYSQL_RES {
      /* 结果集中行的数量 */
      uint64_t row_count;
    
      /* 结果集的字段信息数组指针,每个元素是一个MYSQL_FIELD结构体,描述一个字段 */
      MYSQL_FIELD *fields;
    
      /* 结果数据的实际存储结构体指针,包含记录内容 */
      struct MYSQL_DATA *data;
    
      /* 当前游标指向的结果集中当前行的数据指针 */
      MYSQL_ROWS *data_cursor;
    
      /* 当前行中各个字段值的长度数组,用于变长类型字段 */
      unsigned long *lengths;
    
      /* 指向产生此结果集的MYSQL连接句柄,对于非缓冲读取尤为重要 */
      MYSQL *handle;
    
      /* 结果集操作所使用的特定方法集合,如读取、释放等 */
      const struct MYSQL_METHODS *methods;
    
      /* 未缓冲读取时,指向当前行数据的指针 */
      MYSQL_ROW row;
    
      /* 缓存当前正在处理的行的内部缓冲区 */
      MYSQL_ROW current_row;
    
      /* 用于分配结果集中字段结构的空间的内存管理器 */
      struct MEM_ROOT *field_alloc;
    
      /* 结果集中字段总数 */
      unsigned int field_count;
    
      /* 当前指向的字段索引,在遍历结果集时使用 */
      unsigned int current_field;
    
      /* 标记是否已经到达结果集的末尾(eof:end of file) */
      bool eof;
    
      /* 如果mysql_stmt_close()取消了未完成的非缓冲读取,则设置为真 */
      bool unbuffered_fetch_cancelled;
    
      /* 结果集元数据获取方式 */
      enum enum_resultset_metadata metadata;
    
      /* 扩展字段,可以用于实现特定扩展功能 */
      void *extension;
    } MYSQL_RES;
    
    • 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

    api

    mysql_affected_rows() //返回被最新的UPDATE, DELETE或INSERT查询影响的行数。
     
    mysql_close() //关闭一个服务器连接。
     
    mysql_real_connect() //连接一个MySQL服务器
     
    mysql_change_user() //改变在一个打开的连接上的用户和数据库。
     
    mysql_create_db() //创建一个数据库。该函数不推荐;而使用SQL命令CREATE DATABASE。
     
    mysql_data_seek() //在一个查询结果集合中搜寻一任意行。
     
    mysql_debug() //用给定字符串做一个DBUG_PUSH。
     
    mysql_drop_db() //抛弃一个数据库。该函数不推荐;而使用SQL命令DROP DATABASE。
     
    mysql_dump_debug_info() //让服务器将调试信息写入日志文件。
     
    mysql_eof() //确定是否已经读到一个结果集合的最后一行。这功能被反对;
    mysql_errno()mysql_error()可以相反被使用。
     
    mysql_errno() //返回最近被调用的MySQL函数的出错编号。
     
    mysql_error() //返回最近被调用的MySQL函数的出错消息。
     
    mysql_escape_string() //用在SQL语句中的字符串的转义特殊字符。
     
    mysql_fetch_field() //返回下一个表字段的类型。
     
    mysql_fetch_field_direct() //返回一个表字段的类型,给出一个字段编号。
     
    mysql_fetch_fields() //返回一个所有字段结构的数组。
     
    mysql_fetch_lengths() //返回当前行中所有列的长度。
     
    mysql_fetch_row() //从结果集合中取得下一行。
     
    mysql_field_seek() //把列光标放在一个指定的列上。
     
    mysql_field_count() //返回最近查询的结果列的数量。
     
    mysql_field_tell() //返回用于最后一个mysql_fetch_field()的字段光标的位置。
     
    mysql_free_result() //释放一个结果集合使用的内存。
     
    mysql_get_client_info() //返回客户版本信息。
     
    mysql_get_host_info() //返回一个描述连接的字符串。
     
    mysql_get_proto_info() //返回连接使用的协议版本。
     
    mysql_get_server_info() //返回服务器版本号。
     
    mysql_info() //返回关于最近执行得查询的信息。
     
    mysql_init() //获得或初始化一个MYSQL结构。
     
    mysql_insert_id() //返回有前一个查询为一个AUTO_INCREMENT列生成的ID。
     
    mysql_kill() //杀死一个给定的线程。
     
    mysql_list_dbs() //返回匹配一个简单的正则表达式的数据库名。
     
    mysql_list_fields() //返回匹配一个简单的正则表达式的列名。
     
    mysql_list_processes() //返回当前服务器线程的一张表。
     
    mysql_list_tables() //返回匹配一个简单的正则表达式的表名。
     
    mysql_num_fields() //返回一个结果集合重的列的数量。
     
    mysql_num_rows() //返回一个结果集合中的行的数量。
     
    mysql_options() //设置对mysql_connect()的连接选项。
    char value = 1;
    int iOptions = mysql_options(&this->connObject, MYSQL_OPT_RECONNECT, &value); //解决8小时连接断开问题
    if (iOptions != 0) {
        std::cout << "object mysql_options(MYSQL_OPT_RECONNECT) failed..." << std::endl;
    }
     
    mysql_ping() //检查对服务器的连接是否正在工作,必要时重新连接。
     
    mysql_query() //执行指定为一个空结尾的字符串的SQL查询:
    int mysql_query(MYSQL *mysql,const char *query) 返回值:查询成功返回0;查询出现错误返回非0
     
    mysql_real_connect() //连接一个MySQL服务器。
    if(mysql_real_connect(&conn, "localhost", "mysql_user", "passwd", "database_name", 0, NULL, CLIENT_FOUND_ROWS))
    {
        std::cout << "connect success..." << std::endl;
    }
     
    mysql_real_query() //执行指定为带计数的字符串的SQL查询。
     
    mysql_reload() //告诉服务器重装授权表。
     
    mysql_row_seek() //搜索在结果集合中的行,使用从mysql_row_tell()返回的值。
     
    mysql_row_tell() //返回行光标位置。
     
    mysql_select_db() //连接一个数据库。
     
    mysql_shutdown() //关掉数据库服务器。
     
    mysql_stat() //返回作为字符串的服务器状态。
     
    mysql_store_result() //检索一个完整的结果集合给客户。
     
    mysql_thread_id() //返回当前线程的ID。
     
    mysql_use_result() //初始化一个一行一行地结果集合的检索。
    
    
    • 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
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106
    • 107
    • 108
    • 109
    • 110
    • 111

    from


  • 相关阅读:
    2023/10/05 部分汇编指令
    python3 ConfigParser配置文件解析(config.ini).ini文件节点字段命名规范
    【JWT】快速了解什么是jwt及如何使用jwt
    docker 挂载宿主机文件到容器中
    多线程Future 有结果返回并发
    17、数据的交换输出
    vscode package.json文件开头的{总是提升警告
    AI内容生成时代:该如何和AI对话?
    C语言连接MySQL
    【课程设计|MFC】火车票售票系统(含课程报告+源码)
  • 原文地址:https://blog.csdn.net/qq_60755751/article/details/136631798