MySQL---C/C++链接

一、准备

1.下载mysql库

apt/yum install -y mysql-community-server

2.创建用户

bash 复制代码
create user '用户名'@'%' identified by '密码'
//%代表在所有设备上都能登录,只能本地登录使用'loccalhost'

3.设置权限

bash 复制代码
grant 权限 on 范围 to 用户名
//例: grant all on conn.* to 'connector'@'%'

4.官方文档

mysql.com --> Documentation ->C API -->C API Function Reference

5.包含头文件

cpp 复制代码
#include<mysql/mysql.h>

6.编译

cpp 复制代码
g++ -o mytest test.cc -std=c++11 -L/lib64/mysql -lmysqlclient

二、常用接口

1.mysql_init

功能:初始化

cpp 复制代码
MYSQL *my = mysql_init(nullptr);//失败返回nullptr

2.mysql_close

功能:关闭

cpp 复制代码
mysql_close(my);//不用了就要关闭

3.mysql_real_connect

功能:连接mysql

参数解释:host参数用于指定MySQL服务器的主机地址

user用户用passwd密码连接db数据块

port连接端口号,默认3306

unix_socket 设置为nullptr

client_flag设置为0

返回值:失败返回null

参数准备

cpp 复制代码
const std::string host = "127.0.0.1";//localhost也可以
const std::string user = "connector";
const std::string database = "conn";
const unsigned int port = 3306;

使用

cpp 复制代码
if(mysql_real_connect(my,host.c_str(),user.c_str(),passwd.c_str(),
				   database.c_str(),port,nullptr,0) == nullptr)
{
    std::cout << "connect error" << std::endl;
    return 2;
}
std::cout << "connect success" << std::endl;

4.mysql_query

功能:下达指令

我有一个表

使用

cpp 复制代码
std::string sql;
while(true)
{
    std::cout << "MySQL>>>";
    if(std::getline(std::cin,sql) || sql == "quit") 
    {
        std::cout << "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;;
}

插入成功

cpp 复制代码
//常用示例
std::string sql = "update user set name='jimmy' where name=Tom";
int n = mysql_query(my, sql.c_str());
if(n == 0) std::cout << sql << " success" << std::endl;
else std::cout << sql << "failed" << std::endl;

5.mysql_set_character

功能:插入中文后再select会出现乱码,是因为建立链接的默认字符集不同,该函数能建立字符集

使用,在初始化后

cpp 复制代码
mysql_set_character_set(my, "utf8");

6.mysql_store_result

MYSQL_RES:类型名,将select查出来的数据组织好

cpp 复制代码
MYSQL_RES* res = mysql_store_result(my);
if(nullptr == res)
{
    std::cerr << "mysql_store_result error" << std::endl;
    return 4;
}

7.mysql_num_rows

功能: 获取行数


mysql_num_fields

功能:获取列数

使用案例

cpp 复制代码
my_ulonglong rows = mysql_num_rows(res);

my_ulonglong fields = mysql_num_rows(res);

std::cout << "行:" << rows << std::endl;

std::cout << "列:" << fields << std::endl;

8.mysql_fetch_row

功能:获取一行数据

用法:row保存一行数据,先读取一行,然后再按列打印

cpp 复制代码
for(int i = 0; i < rows; i++)
{
    MYSQL_ROW row = mysql_fetch_row(res);
    for(int j = 0; j < fields; j++)
    {
        std::cout << row[j] << '\t';
    }
    std::cout << std::endl;
}

9.mysql_fetch_fields

功能:提取属性

用法

cpp 复制代码
MYSQL_FIELD *fields_array = mysql_fetch_fields(res);
for(int i = 0; i < fields; i++)
{
    std::cout << fields_array[i].name << '\t';
}
std::cout << std::endl;

10.mysql_free_result

功能:查询结果不会自动释放,必须使用该函数主动释放

使用

cpp 复制代码
mysql_free_result(res);

三、补充内容

1.一个问题: mysql_store_result 的返回值 MYSQL_RES 到底是什么?

2.mysql_fetch_fields 能提取的属性

3.MYSQL_FIELD类型

cpp 复制代码
typedef struct MYSQL_FIELD {
  char *name;               /* Name of column */
  char *org_name;           /* Original column name, if an alias */
  char *table;              /* Table of column if column was a field */
  char *org_table;          /* Org table name, if table was an alias */
  char *db;                 /* Database for table */
  char *catalog;            /* Catalog for table */
  char *def;                /* Default value (set by mysql_list_fields) */
  unsigned long length;     /* Width of column (create length) */
  unsigned long max_length; /* Max width for selected set */
  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;         /* Div flags */
  unsigned int decimals;      /* Number of decimals in field */
  unsigned int charsetnr;     /* Character set */
  enum enum_field_types type; /* Type of field. See mysql_com.h for types */
  void *extension;
} MYSQL_FIELD;

四、代码展示

cpp 复制代码
#include<iostream>
#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 database = "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(nullptr == my)
    {
        std::cerr << "init MySQL error" << std::endl;
        return 1;
    }

    if(mysql_real_connect(my,host.c_str(),user.c_str(),passwd.c_str(),database.c_str(),port,nullptr,0) == nullptr)
    {
        std::cout << "connect 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 name=Tom";
    std::string sql = "select * from user";
    // std::string sql = "insert into user(name,age,telphone) values('张三',33,'3333')";
    int n = mysql_query(my, sql.c_str());
    if(n == 0) std::cout << sql << " success" << std::endl;
    else std::cout << sql << "failed" << std::endl;

    MYSQL_RES* res = mysql_store_result(my);
    if(nullptr == res)
    {
        std::cerr << "mysql_store_result error" << std::endl;
        return 4;
    }
    my_ulonglong rows = mysql_num_rows(res);
    my_ulonglong fields = mysql_num_rows(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 << std::endl;

    //获取表内容
    for(int i = 0; i < rows; i++)
    {
        MYSQL_ROW row = mysql_fetch_row(res);
        for(int j = 0; j < fields; j++)
        {
            std::cout << row[j] << '\t';
        }
        std::cout << std::endl;
    }
    mysql_free_result(res);
    mysql_close(my);
    return 0;
}

相关推荐
Cloud云卷云舒14 小时前
云卷云舒:从Oracle/MySQL迁移到HaishanDB:迁移评估工具核心技术拆解
mysql·oracle·ai-native·haishandb·信创数据库替换
憧憬成为web高手14 小时前
皮卡丘靶场速通--sql 2
数据库·sql·mybatis
段一凡-华北理工大学15 小时前
向量数据库实战:选型、调优与落地~系列文章12:文本分块策略实战:chunk_size 怎么选?重叠多少?
开发语言·数据库·后端·oracle·rust·工业智能体·高炉智能化
oradh17 小时前
Oracle XTTS实现跨版本迁移和升级(Oracle 11g单库升级至19C RAC集群)
数据库·oracle·11g升级19c·xtts跨版本迁移和升级
用户713335851562417 小时前
MySQL - 事务、redo/undo 日志与 MVCC
mysql
z1234567898618 小时前
2026最新两款AI编程工具深度对比实测
java·数据库·ai编程
程序猿DD18 小时前
一个 API Key,统一调用大模型、生图和联网搜索
数据库·网关
java_logo18 小时前
Docker Compose 部署 ClickHouse:快速搭建高性能列式数据库
数据库·clickhouse·docker·列式数据库·轩辕镜像·高性能数据库·clickhouse部署教程
用户713335851562418 小时前
MySQL - InnoDB 的 Buffer Pool
mysql
TlSfoward19 小时前
抓包代理链路下的 TLS 指纹变化分析 TLSFOWARD抓包工具
数据库·爬虫·网络协议·搜索引擎·php