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

文章目录

  • 1、准备工作
  • 2、操作
  • 3、select


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.ccg++ -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;elsestd::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;elsestd::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);

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

结束。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/478744.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

做外贸有哪些值得学习的报价技巧?

外贸新人在收到新客户的询盘后如何第一时间回复邮件报价&#xff0c;一份什么样的报价单&#xff0c;能让客户感受到潜在供应商的工作效率和专业度&#xff1f; 报价单基本内容 完整的卖家基本资料、logo 完整的买家基本信息 抬头要写编号、报价日期 产品基本信息&#xf…

jq 图片懒加载 + Vue-Lazyload

jq原生 图片 懒加载 <!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compati…

js数组转字符串

1, array.toString(),将一个数组转化成一个字符串&#xff0c;转换后的类型为string类型&#xff0c;默认用&#xff0c;隔开。 <script type"text/javascript">var a[1,2,3,4,5,6,7,8,9,0];//原数组var ba.toString();console.log(a)console.log(b)console.…

OpenAI视频生成模型Sora的全面解析:从ViViT、Diffusion Transformer到NaViT、VideoPoet

前言 真没想到&#xff0c;距离视频生成上一轮的集中爆发(详见《Sora之前的视频生成发展史&#xff1a;从Gen2、Emu Video到PixelDance、SVD、Pika 1.0》)才过去三个月&#xff0c;没想OpenAI一出手&#xff0c;该领域又直接变天了 自打2.16日OpenAI发布sora以来(其开发团队包…

Soul CEO张璐团队全方位构筑反诈防护网,守护清朗网络空间

最近,随着《孤注一掷》、《鹦鹉杀》等以反映网络诈骗为题材的电影的热映,网络诈骗问题再次引起舆论的广泛关注。面对不断升级的网络诈骗威胁,以及防无可防的“杀猪盘”,普罗大众该如何避免?互联网社交平台又该如何打击网络诈骗,保障用户的社交安全,这都是摆在线上社交平台发展…

近场2D beamforming Heatmap图

文章目录 想法代码目前啥样 想法 参考论文Beam Focusing for Near-Field Multiuser MIMO Communications&#xff0c;可视化beam focusing效应 代码 clc; clear;% 网格范围 D 1; % 整个均匀平面阵列的孔径 lambda 1e-2; % 波长0.01m&#xff0c;单位&#xff1a;米 30GhzN…

Emlog博客网站快速搭建并结合内网穿透实现远程访问本地站点

文章目录 前言1. 网站搭建1.1 Emolog网页下载和安装1.2 网页测试1.3 cpolar的安装和注册 2. 本地网页发布2.1 Cpolar临时数据隧道2.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;2.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 3. 公网访问测试总结 前言 博客作为使…

图的遍历(广度优先遍历BFS,深度优先遍历DFS)

目录 图的遍历概念&#xff1a; 图的广度优先遍历&#xff08;BFS&#xff09;&#xff1a; 代码实现如下&#xff1a; 测试如下&#xff1a; 注意&#xff1a; 图的深度优先遍历&#xff08;DFS&#xff09;&#xff1a; 代码实现如下&#xff1a; 测试如下&#xff1…

数字孪生核心技术揭秘(五):BIM究竟是解药还是毒药?

一、关于BIM的那些幻想 1.1 BIM是“数字孪生城市”最后一块拼图&#xff1f; 近几年&#xff0c;CIM概念越来越流行&#xff0c;已经成为数字孪生城市的主流数据模型。CIM原始概念指的是“城市信息模型”&#xff1b;2015年同济大学吴志强院士基于CIM概念提出“城市智慧模型”&…

ElscticSearch基础操作

Es数据格式和Mysql对比 ElasticSearch index(索引) Type(类型) Documents(文档) Fields(字段) ​ MySQL Databases(数据库) Table(表) Row(行) Column(列) 倒排索引 正向索引,在Mysql中使用的索引就是正排索引,索引对应的就是直接的数据 例子: id content 1 my name is …

Java系列之 重命名文件/图片,renameTo() 方法的使用

我 | 在这里 &#x1f3e0; 工作 | 广州 ⭐ Java 全栈开发&#xff08;软件工程师&#xff09; ✈️公众号 | 热爱技术的小郑 。文章底部有个人公众号二维码。回复 Java全套视频教程 或 前端全套视频教程 即可获取 300G 教程资料及项目实战案例 &#x1f680; 邮箱 | 297742996…

Linux 主机数据拷贝与 Linux 服务器之间拷贝文件的方法

Linux 主机数据拷贝与 Linux 服务器之间拷贝文件的方法 1. 使用 scp 命令2. 使用 rsync 命令3. 使用 scp 和 rsync 的图形界面工具4. 使用 FTP/SFTP 协议总结与比较 在 Linux 系统中&#xff0c;数据拷贝是日常操作中的常见需求&#xff0c;尤其是在不同主机或服务器之间进行文…