MySQL学习记录——십사 使用C访问MySQL


1、准备工作

root用户的mysql下,创建一个普通用户,创建一个库,通过这个库给普通用户所有权限

create user 'connector'@'localhost' identified by '123456';
create database conn;
grant all on conn.* to 'connector'@'localhost';
flush privileges;
//前提得在root用户下的mysql这个库中
select User,Host from user;

安装C++和C的相关库。有两个办法,更推荐下一个yum源办法,因为第一个办法找不到匹配mysql版本的源。

浏览器输入mysql找到mysql官网

在这里插入图片描述

选择DOWNLOADS,找到这个

在这里插入图片描述

选择最下面的,来到这个页面

在这里插入图片描述

右边那一列最上面两个就是了。这里先下载C的

在这里插入图片描述

中间有个MySQL Connector/C++ 8.0,选择这个。

在这里插入图片描述

显示的是最新版本,archives里是旧版本。根据自己情况选择适合的系统

在这里插入图片描述

下载非debug的。在Linux系统中,在一个目录中,rz空格,找到下载的zip文件,然后传入,传输完成后是这样的,下图的第二个。

在这里插入图片描述

解压出来是一个很长的目录名,可以改一下目录名,目录里是这样

在这里插入图片描述

里面最重要的是include和lib64两个目录。


yum源办法。

mysql5.7版本的数据库,客户端的头文件在 /usr/linclude/mysql中。查看一下安装mysql时的动静态库

ls /lib64/mysql/*

最上方应当有后缀为so,以及a的文件。或者

ls /usr/lib64/mysql/

也和上面一样,so和a后缀的文件。如果没有

yum install mysql-devel

这样就好了。

2、操作

创建一个目录,目录有一个test.cc文件,在这个文件里引用下载好的库。

#include <iostream>
#include <mysql/mysql.h>

int main()
{
    //此函数用来验证引入是否成功
    std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;
    return 0;
}

如果编译的话就会报错。因为我们要连接库

g++ -o test test.cc -L/lib64/mysql -lmysqlclient

makefile

test:test.cc
	g++ -o $@ $^ -std=c++11 -L/lib64/mysql -lmysqlclient
.PHONY:clean
clean:
	rm -f test

引入成功就会打印当前mysql的版本。

mysql官网中的文档页,有C API名字的文档,这个就是使用方法。我当前mysql版本要用的就是5.7。

创建一个mysql对象,初始化并关闭。

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

使用数据库前要先连接数据库。

在这里插入图片描述

#include <iostream>
#include <mysql/mysql.h>
#include <string>

const std::string host = "localhost";
const std::string user = "connector";
const std::string passwd = "123456";
const std::string db = "conn";
const unsigned int port = 8080;


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(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        std::cerr << "connect MySQL error" << std::endl;
        return 1;
    }
    mysql_close(my);
    return 0;
}

在conn库里建一个表

create table user( id bigint primary key auto_increment, name varchar(32) not null, age int not null, telphone varchar(32) unique );

下达mysql指令用mysql_query函数,第一个参数是上面创建的mysql对象,第二个是mysql指令。

    std::string sql;
    while(true)
    {
        std::cout << "MySQL>>> ";
        if(!std::getline(std::cin, sql)|| sql == "quit")
        {
            std::cout << "数据库终止" << 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;
    }
    mysql_close(my);

在输入时如果写错了字符,按住Ctrl再回退即可。这是模拟一下mysql,实际应用时是这样

    std::string sql = "insert into user (name, age, telphone) values ('peter', 19, '4673842')";
    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;

增删改都可以,但是select是比较难处理的,虽然会成功,但不会显示出来,所以select还得有后续工作才能把内容显示在上层。

插入时如果插入中文,可以成功,但是插入后会成为乱码。这是因为服务端和客户端编码不一致造成的,连接数据库后默认的字符集是latin1,需要设置成utf8。

mysql_set_character_set(my, "utf8");

3、select

select在使用后,结果会保存在我们创建的mysql对象my这个句柄中,用提取函数来拿到结果。

    std::string sql = "select * from user";
    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;
        return 3;
    }
    //把内容转储到res中
    MYSQL_RES* res = mysql_store_result(my);
    if(nullptr == res)
    {
        std::cerr << "mysql_store_result error" << std::endl;
        return 4;
    }

查询出来的数据会被mysql当作字符串,一条记录就是一个字符串,对于每一个字符串,多列的信息都聚合到一个字符串中,有一个数组,数组每一个元素都指向一个字符串的一列的内容,而MYSQL_RES结构体里也有指针去指向这样的每个数组。这样就能理解MYSQL_RES里的成员了。

从MYSQL_RES结构体中拿出内容,也有函数。

    //获取结果行数
    my_ulonglong rows = mysql_num_rows(res);
    //获取结果列数
    my_ulonglong fields = mysql_num_fields(res);
    //获取内容, MYSQL_ROW是char**类型的
    for(int i = 0; i < rows; i++)
    {
        MYSQL_ROW ret = mysql_fetch_row(res);//这个函数类似于迭代器
        for(int j = 0; j < fields; j++)
        {
            std::cout << ret[j] << "\t";//*(ret + j)
        }
        std::cout << "\n";
    }

获取更详细信息

    //获取每一条记录的属性
    MYSQL_FIELD* fields_array = mysql_fetch_fields(res);
    for(int i = 0; i < fields; i++)
    {
        //获取列名
        std::cout << fields_array[i].name << "\t";
    }
    std::cout << "\n";

上面是把查询到的内容放到了res中,要释放它,也是有函数的

mysql_free_result(res);

释放最一开始创建的mysql对象则是

mysql_close(my);

官方文档中还有很多接口,比如回滚、提交等操作。

结束。

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值