【MySQL】语言连接

语言连接

一、下载

powershell 复制代码
sudo apt install mysql-server
sudo apt install mysql-client
sudo apt install libmysqlclient-dev

二、mysql_get_client_info

1、函数

2、介绍

  • mysql_get_client_info 是一个用于获取 MySQL 客户端库版本信息的函数。它返回一个指向以 null 结尾的字符串,该字符串表示 MySQL 客户端库的版本。

3、示例

  • 尝试链接mysql client
cpp 复制代码
#include <iostream>
#include <mysql/mysql.h>

int main()
{
    std::cout << "mysql版本: " << mysql_get_client_info() << std::endl;
    return 0;
}
powershell 复制代码
g++ test.cc -l mysqlclient

三、其他函数

1、mysql_init

  • mysql_init 是 MySQL C API 中的一个函数,它的主要功能是分配或初始化一个 MYSQL 对象,使其适用于后续的 mysql_real_connect 函数来建立与 MySQL 数据库的连接。它是建立数据库连接的第一步。
  • 参数mysql是一个指向 MYSQL 结构的指针。如果传递 NULL,mysql_init 将分配并初始化一个新的 MYSQL 结构;如果不为 NULL,则该函数将初始化已存在的 MYSQL 结构。
  • 成功时,返回一个指向已初始化 MYSQL 结构的指针。失败时,返回 NULL。失败的原因通常是因为内存不足,无法分配新的 MYSQL 结构。

2、mysql_real_connect

  • mysql_real_connect 用于建立一个到 MySQL 数据库服务器的连接。在调用 mysql_real_connect 之前,必须调用 mysql_init 来初始化 MYSQL 结构。
参数 说明
mysql 一个指向 MYSQL 结构的指针,该结构在调用 mysql_init 后被初始化
host MySQL 服务器的主机名或 IP 地址。如果为 NULL 或字符串 "localhost",则假定为到本地主机的连接
user 用于登录数据库的用户名。如果为 NULL,则假定为当前用户
passwd 用户密码。如果为 NULL,则仅对该用户的(拥有空密码字段的)用户表中的条目进行匹配检查
db 数据库名称。如果指定,连接后将选择这个数据库
port MySQL 服务器的端口号。如果为 0,则使用默认端口(通常是 3306)
unix_socket 用于连接的 Unix 域套接字或管道的路径。如果为 NULL,则不使用 Unix 套接字
client_flag 用于设置客户端标志的位字段。通常设置为 0,但也可以设置为特定功能的组合

3、mysql_query

  • mysql_query 用于在已经建立的数据库连接上执行 SQL 语句。成功时,返回 0。失败时,返回非 0 值。
参数 说明
mysql 一个指向已经通过 mysql_real_connect 或类似函数成功连接到 MySQL 服务器的 MYSQL 结构体的指针
stmt_str 要执行的 SQL 语句的字符串。这个字符串应该是一个以空字符 ('\0') 结尾的 C 字符串

4、mysql_store_result

  • mysql_store_result 用于检索由 mysql_query 执行的 SELECT 语句的结果集,并将其存储在 MYSQL_RES 结构中,以便后续逐行处理。使用完后需要调用mysql_free_result来释放与之关联的内存资源,以避免内存泄漏。
  • 成功时,返回一个指向 MYSQL_RES 结构体的指针,该结构体包含了结果集的数据。失败时,返回 NULL。

5、mysql_free_result

  • mysql_free_result 用于释放由 mysql_store_result 或类似函数返回的结果集所占用的内存。

6、mysql_num_fields

  • mysql_num_fields 用于获取由 mysql_store_result 或 mysql_use_result 返回的结果集中的字段(列)数量。即函数返回一个无符号整数,表示结果集中的字段数量。

7、mysql_num_rows

  • mysql_num_rows 用于获取由 mysql_store_result 返回的结果集中的行数。即函数返回值表示结果集中的行数。如果结果集为空或检索结果集时发生错误,返回值可能是 0。

8、mysql_fetch_fields

  • mysql_fetch_fields 用于从由 mysql_store_result 返回的结果集中检索所有字段(列)的信息。这个函数返回一个指向 MYSQL_FIELD 结构体数组的指针,其中每个结构体都包含了结果集中一个字段的详细信息。
  • 如果结果集为空或发生错误,返回值可能是 NULL。但通常,只要 mysql_store_result 成功返回了一个结果集,mysql_fetch_fields 就会返回一个有效的指针。

9、mysql_fetch_row

  • mysql_fetch_row 用于从由 mysql_store_result 或 mysql_use_result 返回的结果集中逐行检索数据。
  • 每次调用 mysql_fetch_row 时,它都会返回结果集中的下一行数据,直到没有更多行时返回 NULL。

10、mysql_close

  • mysql_close 用于关闭先前使用 mysql_init 初始化的数据库连接。在应用程序完成对数据库的操作后,应该调用此函数来释放与连接相关的资源,并确保与 MySQL 服务器的连接被正确关闭。

四、示例

  • 创建用户,数据库。方便测试
sql 复制代码
create database conn;
create user connector@localhost identified by '123456';
grant all on conn.* to connector@localhost;

use conn;

create table user(
id int primary key auto_increment,
name varchar(12)
);
  • C++代码
cpp 复制代码
#include <iostream>
#include <string>
#include <mysql/mysql.h>

const char *host = "localhost";
const char *user = "connector";
const char *passwd = "123456";
const char *db = "conn";
unsigned int port = 3306;

int main()
{
    // std::cout << "mysql版本: " << mysql_get_client_info() << std::endl;

    MYSQL* ml = mysql_init(nullptr);
    if(ml == nullptr)
    {
        std::cerr << "mysql_init error" << std::endl;
        return 1;
    }
    if(!mysql_real_connect(ml, host, user, passwd, db, port, nullptr, 0))
    {
        std::cerr << "mysql_real_connect error" << std::endl;
        return 2;
    }
    std::cout << "mysql_init and mysql_real_connect success" << std::endl;

    // std::string query = "insert into user (name) values ('snow')";
    // std::string query = "insert into user (name) values ('dragon')";
    // std::string query = "delete from user where name='snow'";
    std::string query = "select * from user";

    int n = mysql_query(ml, query.c_str());
    if(n == 0)
        std::cout << query << " : success" << std::endl;
    else
    {
        std::cerr << query << " : error" << std::endl;
        return 3;
    }

    MYSQL_RES* res = mysql_store_result(ml);
    if(res == nullptr)
    {
        std::cout << "mysql_store_result: the statement did not return a result set or an error occurred" << std::endl;
        return 4;
    }
    
    int rowsNum = mysql_num_rows(res);
    int fieldsNum = mysql_num_fields(res);

    std::cout << "rowsNum: " << rowsNum << ", fieldsNum: " << fieldsNum <<std::endl;

    MYSQL_FIELD* field = mysql_fetch_fields(res);
    for(int i = 0; i < fieldsNum; ++i)
        std::cout << field[i].name << "\t";
    std::cout << "\n";
    
    MYSQL_ROW row;
    while(row = mysql_fetch_row(res))
    {
        for(int i = 0; i < fieldsNum; ++i)
            std::cout << row[i] << "\t";
        std::cout << "\n";
    }
	
	mysql_free_result(res);
    mysql_close(ml);

    return 0;
}
  • 运行结果,在最后我进行了snow的插入,所以结果如下。

本文到这里就结束了,如有错误或者不清楚的地方欢迎评论或者私信
本文只是在学习过程中所做的总结,不会涉及过深的概念
创作不易,如果觉得博主写得不错,请点赞、收藏加关注支持一下💕💕💕

相关推荐
楽码1 分钟前
只需一文!深入理解闭包的实现
后端·go·编程语言
cong_12 分钟前
🌟摸鱼 TV 搭建属于自己的视频站
前端·后端·github
bobz96514 分钟前
内网网络 rp_filter 参数配置
后端
QING61818 分钟前
Activity和Fragment生命周期 —— 新手指南
android·面试·app
Mazy.v18 分钟前
Linux图形化界面
linux·运维·数据库
开心就好202521 分钟前
【机器学习】用户手机使用行为分析
后端
QING61822 分钟前
Kotlin Result 类型扩展详解 —— 新手使用指南
android·kotlin·app
zwrlj52723 分钟前
编码能效插件SmartInputPro插件扩展
后端
加瓦点灯25 分钟前
从阻塞到 Reactor:理解 Java I/O 背后的架构思维
后端
zzzzz36925 分钟前
服务器返回前端Long类型精度丢失
后端