C/C++链接数据库(MySQL)(超级详细)

目录

1.进入MySQL后,用mysql数据库

1.1查看一看user表

​编辑1.2从user拿出来User和Host

1.3创建一个用户表,只允许本地(想要远端链接就把'localhost'改成'%')

1.4再查一下用户就有了(connector)

1.5测试一下能否登录上

1.6创建一个可以连接的数据库(在root创建的)

1.7但ljw这没法查看到,需要root给权限

1.8给权限再刷新一下

1.9ljw就可以show看到了

2.现在是localhost(本地连接),没法用Windows链接

3.访问数据库,安装C/C++可以访问MySQL的库

3.1开发环境

3.1.1下载头文件

3.1.2查看

3.1.3可以更改mysql端口号

4.在vscode上进行测试

4.1创建一个目录

4.2在vscode上打开并创建文件

4.3包含头文件

4.3.1简单的测试

5.mysql接口介绍

5.1官方文档

5.2介绍一下常用的几个接口

5.2.1初始化mysql_init()

5.2.2关闭数据库mysql_close

​编辑

5.2.3链接数据库mysql_real_connect

5.2.3.1建立好链接之后,获取英文没有问题,如果获取中文是乱码:

5.2.3.1.1mysql_set_character_set

[5.2.4 查看链接失败](#5.2.4 查看链接失败)

5.2.5查看链接状态

[5.2.6 下发mysql命令mysql_query](#5.2.6 下发mysql命令mysql_query)

5.2.7常规用法

5.3解决select

5.3.1获取执行结果mysql_store_result

[5.3.2 表上数据的本质就是一个二维数组(行,列)](#5.3.2 表上数据的本质就是一个二维数组(行,列))

5.3.2.1获取结果行数mysql_num_rows

5.3.2.2获取结果列数mysql_num_fields

[5.3.2.3 如同迭代器一般 获取结果内容mysql_fetch_row](#5.3.2.3 如同迭代器一般 获取结果内容mysql_fetch_row)

[5.3.3 获取列属性 mysql_fetch_fields](#5.3.3 获取列属性 mysql_fetch_fields)

[5.3.4 记得释放 mysql_free_result](#5.3.4 记得释放 mysql_free_result)


1.进入MySQL后,用mysql数据库

1.1查看一看user表

1.2从user拿出来User和Host

1.3创建一个用户表,只允许本地**(想要远端链接就把'localhost'改成'%')**

bash 复制代码
mysql> create user '自己取的名字'@'localhost' identified by '自己的密码';

1.4再查一下用户就有了(connector)

1.5测试一下能否登录上

1.6创建一个可以连接的数据库(在root创建的)

1.7但ljw这没法查看到,需要root给权限

1.8给权限再刷新一下

1.9ljw就可以show看到了

2.现在是localhost(本地连接),没法用Windows链接

3.访问数据库,安装C/C++可以访问MySQL的库

3.1开发环境

3.1.1下载头文件

如果没有下载:下载头文件;可以用这个命令下载一下:

bash 复制代码
sudo apt install libmysqlclient-dev

3.1.2查看

3.1.3可以更改mysql端口号(3306)

bash 复制代码
vim /etc//mysql//mysql.conf.d/mysqld.cnf

自己添加即可

4.在vscode上进行测试

4.1创建一个目录

4.2在vscode上打开并创建文件

4.3包含头文件

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

4.3.1简单的测试

  • test.cc
  • 通过 mysql_get_client_info() 函数,来验证我们的引入是否成功
cpp 复制代码
#include <iostream>
#include <mysql/mysql.h>

int main() {
    printf("mysql client Version: %s\n", mysql_get_client_info());
    return 0;
}
  • makfile(记得加上 -lmysqlclient)
cpp 复制代码
test:test.cc
	g++ -o $@ $^ -std=c++11 -lmysqlclient
.PHONY:clean
clean:
	rm -f test

5.mysql接口介绍

5.1官方文档

https://dev.mysql.com/doc/c-api/9.1/en/

5.2介绍一下常用的几个接口

要使用库,必须先进行初始化! 常用接口 mysqld是一套网络服务那么就注定了我们在进行mysql操作之前,一定是要能链接上mysql,所以要在之前创建一些基础的mysql数据结构。

5.2.1初始化mysql_init()

MySQL :: MySQL 8.0 C API Developer Guide :: 5.4.41 mysql_init()

cpp 复制代码
int main() 
{
    MYSQL* my = mysql_init(nullptr);
    if(my == nullptr)
    {
        cerr<< "init MySQL error" <<endl;
        return 1;
    }

    return 0;
}

5.2.2关闭数据库mysql_close

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.5 mysql_close()

5.2.3链接数据库mysql_real_connect

MySQL :: MySQL 8.0 C API Developer Guide :: 5.4.58 mysql_real_connect()

初始化完毕之后,必须先链接数据库,在进行后续操作。(mysql网络部分是基于TCP/IP的)

cpp 复制代码
const string host = "localhost";
const string user = "ljw";
const string passwd = "ljw031126";
const string db = "jj";
const unsigned int port = 6666;
cpp 复制代码
#include <iostream>
#include <string>
#include <mysql/mysql.h>

using namespace std;

const string host = "localhost";
const string user = "ljw";
const string passwd = "ljw031126";
const string db = "jj";
const unsigned int port = 6666;

int main() 
{
    MYSQL* my = mysql_init(nullptr);
    if(my == nullptr)
    {
        cerr<< "init MySQL error" <<endl;
        return 1;
    }

    if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        cerr<< "connect MYSQL error" <<endl;
        return 2;
    }
    //到这就链接成功了
    cout<< "success" <<endl;

    //关闭~
    mysql_close(my);
    return 0;
}

测试:

5.2.3.1建立好链接之后,获取英文没有问题,如果获取中文是乱码:

设置链接的默认字符集是utf8,原始默认是latin1

5.2.3.1.1mysql_set_character_set

MySQL :: MySQL 5.7 C API 开发指南 :: 5.4.69 mysql_set_character_set()

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

5.2.4 查看链接失败

若关闭mysql服务就会连接失败

5.2.5查看链接状态

bash 复制代码
show processlist;

5.2.6 下发mysql命令mysql_query

MySQL :: MySQL 8.4 C API 开发指南 :: 5.4.57 mysql_query()

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

using namespace std;

const string host = "localhost";
const string user = "ljw";
const string passwd = "ljw031126";
const string db = "jj";
const unsigned int port = 6666;

int main() 
{
    MYSQL* my = mysql_init(nullptr);
    if(my == nullptr)
    {
        cerr<< "init MySQL error" <<endl;
        return 1;
    }

    if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        cerr<< "connect MYSQL error" <<endl;
        return 2;
    }

    string sql;
    while(true)
    {
        cout<< "MYSQL>>>";
        if(!getline(cin, sql) || sql == "quit")
        {
            cout<< "bye bye" <<endl;
            break;
        }
        int n =mysql_query(my, sql.c_str());
        if(n == 0)
        {
            cout<< sql << "success: " << n <<endl;
        }
        else{
            cerr<< sql << "faild" <<endl;
        }
    }

    //到这就链接成功了
    cout<< "success" <<endl;

    //关闭~
    mysql_close(my);
    return 0;
}

测试:

先创建个表,并给上权限

这里的;可以不用加 (这里测试时,没法直接back,要按住ctrl 和 back一起)

5.2.7常规用法

增删改是最简单的,只需要保证这个是成功的

这个select不行,没结果

5.3解决select

5.3.1获取执行结果mysql_store_result

MySQL :: MySQL 8.0 C API 开发指南 :: 5.4.84 mysql_store_result()

把结果转储到MYSQL_RES了(是为了更好的做二次处理)

5.3.2 表上数据的本质就是一个二维数组(行,列)

5.3.2.1获取结果行数mysql_num_rows
5.3.2.2获取结果列数mysql_num_fields
5.3.2.3 如同迭代器一般 获取结果内容mysql_fetch_row

这样的话结果就拿到了

这样就可以打印出来了

5.3.3 获取列属性 mysql_fetch_fields

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.19 mysql_fetch_fields()

打印结果

很多内容属性都可以查

5.3.4 记得释放 mysql_free_result

相关推荐
尘浮生12 分钟前
Java项目实战II基于SpringBoot的客户关系管理系统(开发文档+数据库+源码)
java·开发语言·数据库·spring boot·后端·微信小程序·小程序
晚风_END16 分钟前
postgresql|数据库开发|python的psycopg2库按指定顺序批量执行SQL文件(可离线化部署)
服务器·开发语言·数据库·python·sql·postgresql·数据库开发
桃园码工34 分钟前
2-测试bigcache做进程内缓存 --开源项目obtain_data测试
vscode·mysql·go·postman
晴子呀35 分钟前
Redis除了做缓存,还能做什么???
数据库·redis·缓存
sxy1993sxy201836 分钟前
数据库和缓存的数据一致性 -20241124
数据库·缓存
hxj..37 分钟前
【中间件】Redis
数据库·redis·缓存·中间件
孙克旭_38 分钟前
第四章 Redis多级缓存案例
数据库·redis·缓存
九河云1 小时前
分布式数据库中间件可以用在哪些场景呢
数据库·分布式·中间件·华为云
白云如幻2 小时前
MySQL子查询介绍和where后的标量子查询
数据库·mysql
小玉起起2 小时前
Redis Key 命名规范文档
数据库·redis·缓存