【MySQL】C语言连接数据库

这篇具有很好参考价值的文章主要介绍了【MySQL】C语言连接数据库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、安装 MySQL 库

我们之前学习数据库都是在 Linux 的 mysql 客户端下以纯命令行的方式操作的,但其实,我们也可以使用 C/C++/Java/Python 等语言来连接数据库,向 mysqld 下达 sql 语句并获取执行结果。不过,在这之前,我们需要先安装 MySQL 对应的库,这里我们以 C 语言连接数据库为例。

关于 MySQL 的 C语言库,我们可以直接到 MySQL 官网中去下载,然后 rz 上传到 Linux 中解压。当然我们也可以通过 yum 来直接安装 mysql client 以及 mysql devel,因为之前我们在安装 mysql-commun-server 时已经配置了 mysql 相关的 yum 源。(其实那时候 mysql client 我们也已经安装了)【MySQL】C语言连接数据库,MySQL,数据库,mysql,c语言

【MySQL】C语言连接数据库,MySQL,数据库,mysql,c语言

【MySQL】C语言连接数据库,MySQL,数据库,mysql,c语言

安装完毕后我们就可以在 /usr/include/mysql 目录下找到 mysql 相关的头文件了:【MySQL】C语言连接数据库,MySQL,数据库,mysql,c语言

同时,我们也可以在 /lib64/mysql/ 以及 /usr/lib64/mysql 目录下找到 mysql 对应的动态库以及静态库了:【MySQL】C语言连接数据库,MySQL,数据库,mysql,c语言

验证引入是否成功

现在,我们就可以使用 mysql 目录下头文件中提供的相关函数来连接数据库了。

不过,在正式连接数据库之前,我们可以先通过 mysql_get_client_info() 函数来验证一下 mysql 相关头文件以及动态库是否被成功引入:

函数原型:const char *mysql_get_client_info(void);
返回值: A character string that represents the MySQL client library version.
#include <iostream>
#include <mysql/mysql.h>
using namespace std;

int main()
{
    cout << "mysql version: " << mysql_get_client_info() << endl;
    return 0;
}

【MySQL】C语言连接数据库,MySQL,数据库,mysql,c语言

这里有几个需要注意的地方:

  1. 由于我们要使用 mysql C库中的函数,所以在 test.cc 中我们需要包含 mysql 相关头文件。
  2. 在程序编译时,我们需要使用 -l 选项来指定我们要链接的 mysql 动态库,并且动态库的库名称是去掉前缀 lib 以及后缀 .so 后的剩余部分。(libmysqlclient.so -> mysqlclient)
  3. 由于动态库在 /usr/lib64/mysql/ 目录下,而系统的默认库路径是 /usr/lib64/,所以我们还需要使用 -L 选项来指定动态库的路径。
  4. mysql C语言相关头文件在 /usr/include/mysql/ 目录下,而系统默认的头文件搜索路径是 /usr/include/,所以按道理来说,我们也是需要使用 -I 选项指明头文件路径的;但这里由于我们在编写源程序,包含头文件时使用的是 mysql/mysql.h,而不仅仅是 mysql.h,所以不需要指定。
  5. 最后,关于动静态库相关的知识,我们其实以前在 Linux 系统编程中讲过,有需要的同学可以再看一下 – 动静态库。

二、MySQL C API 相关接口

1、C API 官方文档

关于C语言连接数据所涉及到的各种数据结构的介绍以及相关函数的使用其实在 MySQL C API 官方文档中已经给出了,我们可以通过它来快速了解并上手 MySQL C API。【MySQL】C语言连接数据库,MySQL,数据库,mysql,c语言

【MySQL】C语言连接数据库,MySQL,数据库,mysql,c语言

2、初始化 MYSQL

要使用 MySQL C语言库,需要先使用 mysql_init 函数完成对 MYSQL 结构体指针的初始化工作。

MYSQL *mysql_init(MYSQL *mysql)
  • 函数返回值:失败返回 NULL。

注意:mysql_init 函数的参数以及返回值都是 MYSQL 指针类型,对于 MYSQL,大家把它类比到C语言中的文件指针来理解即可。MYSQL 和C语言文件 FILE 一样,本质上都是一个结构体。【MySQL】C语言连接数据库,MySQL,数据库,mysql,c语言

【MySQL】C语言连接数据库,MySQL,数据库,mysql,c语言

MYSQL *mfp = mysql_init(nullptr);
if(mfp == nullptr)
{
    cerr << "mysql init error" << endl;
    return 1;
}
cout << "mysql init success" << endl;

【MySQL】C语言连接数据库,MySQL,数据库,mysql,c语言

注意:这里用C语言的 NULL 还是C++的 nullptr 都可以,因为它们在数值上都是0;区别在于在定义时 NULL 是一个整数,而 nullptr 则是被强转为了 void* 类型。

3、连接 MySQL

初始化完毕后,我们需要使用 mysql_real_connect 函数来连接数据库。

MYSQL *
mysql_real_connect(MYSQL *mysql,       // MYSQL结构体指针对象
                   const char *host,   // mysqld服务进程所在的主机
                   const char *user,   // 登录MySQL的用户
                   const char *passwd, // 用户密码
                   const char *db,     // 要访问的数据库
                   unsigned int port,  // mysqld服务进程的端口号
                   const char *unix_socket,    // 默认设为NULL即可
                   unsigned long client_flag)  // 默认设为0即可
  • 函数返回值:失败返回0,成功返回传入的MYSQL指针。
const string host = "127.0.0.1";
const string user = "thj";
const string password = "Abcd1234@";
const string db = "test_connection";
unsigned int port = 4106;
mfp = mysql_real_connect(mfp, host.c_str(), user.c_str(), password.c_str(), db.c_str(), port, nullptr, 0);
if(mfp == nullptr)
{
    cerr << "mysql connection error" << endl;
    return 2;
}
cout << "mysql connection success" << endl;

【MySQL】C语言连接数据库,MySQL,数据库,mysql,c语言

其实从这里我们也可以看出 MYSQL 其实就是一个结构体,其中包含了 host、user、port 等字段,我们调用 mysql_real_connect 函数时传递的参数就是用来填充这些字段的。【MySQL】C语言连接数据库,MySQL,数据库,mysql,c语言

设置连接字符集

需要注意的是,我们之前在创建数据库时默认使用的字符集是 utf8,而C语言连接数据时默认的字符集是 latin1 的,这就会导致我们在向表中插入中文数据时,由于字符集不匹配,最终数据库中存储的数据显式出来是乱码。

所以,我们需要使用 mysql_set_character_set 函数设置连接字符集为 utf8

int mysql_set_character_set(MYSQL *mysql, const char *csname)
  • 函数返回值:返回0表示成功,非0表示失败。
int n = mysql_set_character_set(mfp, "utf8");
if(n != 0) { cout << "warning: character set fail" << endl; }

4、下发 mysql 指令

在成功连接到数据库之后,我们就可以通过 mysql_query 函数来下发 mysql 指令了。

int mysql_query(MYSQL *mysql, const char *stmt_str)
  • 函数返回值:执行成功返回0,失败返回非0。
string sql;
while(true)
{
    cout << "mysql>>> ";
    getline(cin, sql);
    int n = mysql_query(mfp, sql.c_str());
    if(n != 0) 
    { 
        cout << sql << " fail" << endl; 
    }
    else cout << sql << " success" << endl;
}

【MySQL】C语言连接数据库,MySQL,数据库,mysql,c语言

我们可以登录 msyql 客户端查看数据是否真正被插入:【MySQL】C语言连接数据库,MySQL,数据库,mysql,c语言

需要注意的是,我们在使用 mysql client 时,一条 sql 语句需要以分号结尾;但是在C语言中,sql 语句可以不用带分号,当然带上也没事。

5、获取 mysql 查询结果

我们上面是对数据库执行增删改操作,它们相对来说比较简单,因为我们只需要将指令下发给数据库即可,后面的事情我们不必关心。但如果我们执行的是查询操作,则需要通过 mysql_store_result 函数来获取查询结果。

MYSQL_RES *mysql_store_result(MYSQL *mysql)
  • 函数返回值:失败返回 NULL,成功返回一个非空的 MYSQL_RES 类型的结构体指针。

实际上,mysql_store_result 函数会调用 MYSQL 结构体变量中的 st_mysql_methods 字段中的 read_rows 函数指针来获取查询的结果;然后将查询结果保存到 MYSQL_RES 结构体中并返回结构体指针。这样,当执行完 mysql_store_result 以后,其实数据都已经在MYSQL_RES 变量中了,我们直接从中获取即可。

需要注意的是,MYSQL_RES 是通过 malloc/new 空间的方式来保存查询结果的,所以当我们使用完毕之后,一定要记得释放 MYSQL_RES 对象,否则就会造成内存泄漏。同时,MYSQL_RES 结构体中存在查询结果的列数、列信息、行数、行内容等属性,我们需要使用对应的函数来获取这些信息。【MySQL】C语言连接数据库,MySQL,数据库,mysql,c语言

  • 获取结果列数。
unsigned int mysql_num_fields(MYSQL_RES *result)
  • 获取结果中每一列的列属性。
MYSQL_FIELD *mysql_fetch_field(MYSQL_RES *res);

关于 MYSQL_FIELD 结构体,它里面包含了列的各种属性信息,包括列名称、列类型、列大小、列属于哪个表哪个库等等。【MySQL】C语言连接数据库,MySQL,数据库,mysql,c语言

同时,我们可以通过重复调用 mysql_fetch_field 函数来获取表中每个列字段的 MYSQL_FIELD 结构,即当我们下次再调用 mysql_fetch_field 函数时,会自动获取到表中下一个列的属性信息,而不需要我们手动指定访问的是哪一列。这和C++中的迭代器很类似。 这种类似迭代器的功能应该是与 MYSQL_RES 中的 current_field 字段有关。【MySQL】C语言连接数据库,MySQL,数据库,mysql,c语言

当然,我们也可以通过调用 mysql_fetch_fields 函数一次获取到所有列的属性信息,然后分别打印。

MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
  • 获取结果行数。
my_ulonglong mysql_num_rows(MYSQL_RES *result)
  • 获取结果中每一行的具体内容。
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)

MYSQL_ROW 本质上其实是一个二级指针,我们可以把它当作一个一级指针数组来看待,数组中的每个元素都是一级指针。同时,由于 MYSQL_RES 中保存的是查询到的多行结果,所以我们可以将 MYSQL_RES 看作是一个二级指针数组,数组中的每个元素都是二级指针 (MYSQL_ROW)【MySQL】C语言连接数据库,MySQL,数据库,mysql,c语言

【MySQL】C语言连接数据库,MySQL,数据库,mysql,c语言

如上,将 MYSQL_RES 当作一个二维数组,那么 MYSQL_RES 中的每一个元素就代表查询结果中的一行数据 (不包含属性行),这行数据是一个一维数组,且数组中的每个元素都是 char* 类型 (mysql 在读取数据时会将所有的数据都当作字符串)。这样,我们就可以先使用 mysql_num_rows 和 mysql_num_fields 获取到结果集的行数和列数,然后以遍历二维数组的方式即可获取到全部行的内容了

具体示例如下:

// 下发mysql指令 -- 查询
string sql = "select * from user";
if (mysql_query(mfp, sql.c_str()) != 0)
{ 
    cout << sql << " fail" << endl; 
}
else cout << sql << " success" << endl;

// 将查询结果转储到MYSQL_RES中
MYSQL_RES *res = mysql_store_result(mfp);
if(res == nullptr)
{
    cerr << "store query result error" << endl;
    return 3;
}

// 获取结果集的行数与列数
size_t rowCount = mysql_num_rows(res);
size_t colCount = mysql_num_fields(res);

// 打印列属性信息 -- 一次获取单列
for(int i = 0; i < colCount; i++)
{
    // 一个列字段的所有属性 -- 自动迭代
    MYSQL_FIELD *field = mysql_fetch_field(res);
    cout << field->name << '\t';
}
cout << endl;

// 一次获取全部列字段的属性信息,然后分别打印
// MYSQL_FIELD *total_fields = mysql_fetch_fields(res);
// for(int i = 0; i < colCount; i++)
// {
//     cout << total_fields[i].name << '\t';
// }
// cout << endl;

// 打印结果集中的行内容
for(int i = 0; i < rowCount; i++)
{
    // 一行的所有内容 -- 自动迭代
    MYSQL_ROW row = mysql_fetch_row(res);
    for(int j = 0; j < colCount; j++)
    {
        // 一行内容中的某一列的内容
        cout << row[j] << '\t';
    }
    cout << endl;
}

【MySQL】C语言连接数据库,MySQL,数据库,mysql,c语言

6、释放 MYSQL_RES 对象

由于 MYSQL_RES 保存查询结果的空间是通过 malloc/new 得到的,所以当我们使用完毕后需要释放掉 MYSQL_RES 对象,防止内存泄露。

void mysql_free_result(MYSQL_RES *result)
mysql_free_result(res);

7、关闭 MySQL 连接

最后,当我们使用完 MySQL 后,需要关闭 MySQL 之前建立的连接。

void mysql_close(MYSQL *sock);
mysql_close(mfp);

8、MySQL 其他操作

除了上述这些操作外,MySQL C API 还支持事务、回滚等常见操作,感兴趣的同学可以了解一下。

my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode);
my_bool STDCALL mysql_commit(MYSQL * mysql);
my_bool STDCALL mysql_rollback(MYSQL * mysql);

9、总结

使用 MySQL C API 连接数据库进行简单操作的步骤如下:

  1. 初始化 MYSQL 结构体指针 – mysql_init。
  2. 连接 MySQL – mysql_real_connect:需要指定数据库服务所在主机、端口以及登录mysql的用户和密码等信息。
  3. 下发 MySQL 指令 – mysql_query。
  4. 获取 MySQL 查询结果:将查询结果转储到 MYSQL_RES 中 – mysql_store_result,获取查询结果的行数 – mysql_num_rows,获取查询结果列数 – mysql_num_fields,获取单个/所有列字段的 MYSQL_FIELD 属性信息 – mysql_fetch_field/mysql_fetch_fields,获取查询结果单行的内容 (不包含属性行) – mysql_fetch_row。
  5. 释放 MYSQL_RES 对象 – mysql_free_result。
  6. 关闭 MySQL 连接 – mysql_close。
#include <iostream>
#include <mysql/mysql.h>
using namespace std;

int main()
{
    // 验证C库是否引入成功
    // cout << "mysql version: " << mysql_get_client_info() << endl;

    // 初始化MYSQL指针
    MYSQL *mfp = mysql_init(nullptr);
    if(mfp == nullptr)
    {
        cerr << "mysql init error" << endl;
        return 1;
    }
    cout << "mysql init success" << endl;

    // 连接数据库
    const string host = "127.0.0.1";
    const string user = "thj";
    const string password = "Abcd1234@";
    const string db = "test_connection";
    unsigned int port = 4106;
    mfp = mysql_real_connect(mfp, host.c_str(), user.c_str(), password.c_str(), db.c_str(), port, nullptr, 0);
    if(mfp == nullptr)
    {
        cerr << "mysql connection error" << endl;
        return 2;
    }
    cout << "mysql connection success" << endl;

    // 设置连接字符集
    int n = mysql_set_character_set(mfp, "utf8");
    if(n != 0) { cout << "warning: character set fail" << endl; }

    // 下发mysql指令 -- 增删改
    // string sql;
    // while(true)
    // {
    //     cout << "mysql>>> ";
    //     getline(cin, sql);
    //     int n = mysql_query(mfp, sql.c_str());
    //     if(n != 0) 
    //     { 
    //         cout << sql << " fail" << endl; 
    //     }
    //     else cout << sql << " success" << endl;
    // }

    // 下发mysql指令 -- 查询
    string sql = "select * from user";
    if (mysql_query(mfp, sql.c_str()) != 0)
    { 
        cout << sql << " fail" << endl; 
    }
    else cout << sql << " success" << endl;

    // 将查询结果转储到MYSQL_RES中
    MYSQL_RES *res = mysql_store_result(mfp);
    if(res == nullptr)
    {
        cerr << "store query result error" << endl;
        return 3;
    }

    // 获取结果集的行数与列数
    size_t rowCount = mysql_num_rows(res);
    size_t colCount = mysql_num_fields(res);

    // 打印列属性信息 -- 一次获取单列
    for(int i = 0; i < colCount; i++)
    {
        // 一个列字段的所有属性 -- 自动迭代
        MYSQL_FIELD *field = mysql_fetch_field(res);
        cout << field->name << '\t';
    }
    cout << endl;

    // 一次获取全部列字段的属性信息,然后分别打印
    // MYSQL_FIELD *total_fields = mysql_fetch_fields(res);
    // for(int i = 0; i < colCount; i++)
    // {
    //     cout << total_fields[i].name << '\t';
    // }
    // cout << endl;

    // 打印结果集中的行内容
    for(int i = 0; i < rowCount; i++)
    {
        // 一行的所有内容 -- 自动迭代
        MYSQL_ROW row = mysql_fetch_row(res);
        for(int j = 0; j < colCount; j++)
        {
            // 一行内容中的某一列的内容
            cout << row[j] << '\t';
        }
        cout << endl;
    }

   // 释放MYSQL_RES对象
   mysql_free_result(res);

   // 关闭数据库连接
   mysql_close(mfp);

    return 0;
}

三、使用图形化工具连接 MySQL

其实除了使用各种编程语言来连接数据库之外,在实际开发中另一种比较常用的方式是使用图形化工具来连接数据库。

市场上关于 MySQL 的图形化工具有很多,其中比较优秀的是 Navicat 和 SQLyog,但他们都是收费的,当然如果个人使用的话可以在网上下载破解版的。免费的工具也有很多,但大都不怎么好用,在免费工具中表现比较优秀的是 MySQL 官方开发的 Workbench。如果大家有兴趣的话可以去尝试一下,这里我仅仅简单提一下。

相关文章阅读推荐:https://blog.csdn.net/wpc2018/article/details/122862956文章来源地址https://www.toymoban.com/news/detail-718847.html


到了这里,关于【MySQL】C语言连接数据库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • c++ 连接mysql数据库

            使用vs2019对window11中的数据库进行连接 1. 配置连接环境         首先需要把mysql中的头文件和库文件放入到c++项目工程中 1.打开安装MySQL的目录,在windows系统中如果是默认路径,应该和我的是一样的:C:Program FilesMySQLMySQL Server 8.0 2.找到include,和lib文件,inclu

    2024年02月02日
    浏览(49)
  • scala连接mysql数据库

    scala中通常是通过JDBC组件来连接Mysql。JDBC, 全称为Java DataBase Connectivity standard。 加载依赖 其中包含 JDBC driver 1.1 spark组件直接连接(推荐) 通过spark.read直接连接,直接得到dataframe 注意:driver的类名根据不同的JDBC版本不同,早一些的版本为 com.mysql.jdbc ,而不是 com.mysql.cj.jdbc

    2024年02月13日
    浏览(39)
  • Java连接mysql数据库

    java连接mysql大致需要这六步: 导入驱动包 :这里我使用的是mysql-connector-java-8.0.17.jar( 点击下载 ),这个包连接mysql5.6,5.7,8.0版本都没问题。 Class.forName(\\\"com.mysql.cj.jdbc.Driver\\\"); url和账户名密码 JDBC连接串: jdbc:mysql://地址:端口/数据库 获取连接 : DriverManager.getConnection(url, user

    2024年02月02日
    浏览(50)
  • Mysql查询数据库连接状态及连接信息

    使用MySQL时,需要了解当前数据库的情况,例如当前的数据库大小、字符集、用户等等。下面总结了一些查看数据库相关信息的命令 查看显示所有数据库 查看当前使用的数据库 查看数据库使用端口 查看当前数据库大小 例如,我要查看INVOICE数据库的大小,那么可以通过下面

    2024年02月11日
    浏览(57)
  • MySQL数据库,JDBC连接数据库操作流程详细介绍

    在学完 MySQL 和 Java 后,我们通常会尝试使用 Java编译器 连接 MySQL数据库,从而达到使用编译器来操作数据库的效果。连接的这个过程会用 JDBC 相关知识,因此我把 JDBC 包的下载及导入流程,以及 JDBC 的使用流程整理下来分享给大家。 目录 1. 啥是JDBC? 2. JDBC依赖包 2.1 依赖包

    2024年02月06日
    浏览(104)
  • 使用python连接mysql数据库

    第一章 Python 机器学习入门之连接mysql数据库 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 在控制台输入如下: 代码如下(示例): 演示

    2024年02月16日
    浏览(69)
  • Django的mysql数据库连接

    首先Mysql和navicate Premuim 已经安装好,并且可以建立数据库的连接,本次需使用的工具是 1、vs code 2、navicate Premuim 3、Mysql 打开vs code ,按Ctrl+ Shift + ~ ,调出vs code的终端界面,输入以下命令创建 test11 项目  django-admin startproject test11 (1)创建虚拟环境命令: 需要跳转到项目test1

    2024年02月05日
    浏览(61)
  • Unity2020连接MySQL数据库

    重新梳理一下这篇帖子(算是第三次较大变动的修正补充)。         本文章涉及Unity 3D版本:2020.3.20f1、MySQL5.7。(经过亲测,2019-2022均适用)         前期为了让Unity连接MySQL,参考了许多帖子,瞎琢磨,安装了下图中的各包,其中MySQL-connector-net/-for-visualstudio的版本分

    2023年04月25日
    浏览(42)
  • PHP之 连接MySql数据库

    上一节已经成功配置了php+mysql开发环境( https://mp.csdn.net/mp_blog/creation/editor/129432310), 下面将进行实战连接数据库 一,打开sublime3编辑器,配置php开发环境 1.1 在网站根目录下新建php项目文件夹,存放php文件 1.2 安装Package Control,按下ctrl+shift+p,调出输入框输入Package Control,

    2024年02月02日
    浏览(64)
  • 【MySQL】使用C++连接数据库

    创建数据库并选中 创建表并描述表结构 增加删除修改均可正常执行,查询较为复杂,整体代码中有案例 如果查询则需要把查询数据保存到结果集,通过mysql所提供的函数 得到行和列,遍历得到结果。 初始化mysql并返回句柄(默认传入nullptr即可) 如: MYSQL *mfp = mysql_init(nul

    2024年02月13日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包