MySQL和语言的连接

news2024/12/25 12:48:50

1.下载开发包

有了之前的基础,就可以使用语言来使用数据库了,实际上原生命令行操作数据库的场景比较少,语言级别的库和包才更加常用,接下我来带您学习如何使用 C/C++ 访问 MySQL 客户端。

然后创建一个可以远程登录的用户,并且拥有对一个 coon 数据库的所有权限。

然后去 官网 安装对应的库。

在这里插入图片描述

我们这里只演示 C 语言的调用。

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

但是这个方法比较麻烦,并且易错,因此这里只是简单讲一下流程,我还是推荐您直接使用 yum 来安装。

但是其实我们之前就安装过了,在使用 yum install -y mysql -community-server 时候,就已经安装过了。

可以使用 ls /usr/include/mysql 查看内部有关 MySQL 的头文件。

若没有找到就使用 yum install -y mysql-devel 下载对应的开发工具。

# 查看对应的头文件
# ls /usr/include/mysql
big_endian.h              my_getopt.h         my_xml.h
binary_log_types.h        my_global.h         plugin_audit.h
byte_order_generic.h      my_list.h           plugin_ftparser.h
byte_order_generic_x86.h  mysql               plugin_group_replication.h
decimal.h                 mysql_com.h         plugin.h
errmsg.h                  mysql_com_server.h  plugin_keyring.h
keycache.h                mysqld_ername.h     plugin_validate_password.h
little_endian.h           mysqld_error.h      sql_common.h
m_ctype.h                 mysql_embed.h       sql_state.h
m_string.h                mysql.h             sslopt-case.h
my_alloc.h                mysql_time.h        sslopt-longopts.h
my_byteorder.h            mysql_version.h     sslopt-vars.h
my_command.h              mysqlx_ername.h     thr_cond.h
my_compiler.h             mysqlx_error.h      thr_mutex.h
my_config.h               mysqlx_version.h    thr_rwlock.h
my_config_x86_64.h        my_sys.h            typelib.h
my_dbug.h                 my_thread.h
my_dir.h                  my_thread_local.h

# ls /lib64/mysql
libmysqlclient.a   libmysqlclient.so.20       libmysqlservices.a  plugin
libmysqlclient.so  libmysqlclient.so.20.3.31  mecab

尝试在 C 中使用 MySQL 的接口。

//main.cc 内部
#include <stdio.h>
#include <mysql/mysql.h>
int main()
{
    printf("mysql client Version: %s\n", mysql_get_client_info()); //获取客户端版本信息
    return 0;
}

然后使用 g++ main.cc -L/lib64/mysql -lmysqlclient,在我这边回显的结果为 mysql client Version: 5.7.44

2.使用 API

补充:接口地址。

接下来我们直接通过一个程序来学习接口的使用。

首先先创建一个表,并且设置对应用户的权限,开发云服务器的端口号。

# 创建表结构
mysql> create table test_table( id bigint primary key auto_increment, name va
rchar(32) not null, age int not null, telphone varchar(32) unique );
Query OK, 0 rows affected (0.06 sec)

mysql> desc test_table;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | bigint(20)  | NO   | PRI | NULL    | auto_increment |
| name     | varchar(32) | NO   |     | NULL    |                |
| age      | int(11)     | NO   |     | NULL    |                |
| telphone | varchar(32) | YES  | UNI | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

然后编写代码如下:

//main.cc 内部
#include <iostream>
#include <string>
#include <unistd.h>
#include <mysql/mysql.h>

const std::string host = "127.0.0.1"; //也可以使用 localhost
const std::string user = "jimou";
const std::string passwd = "**********"; //这里我隐去了我的密码
const std::string db = "conn";
const unsigned int port = 8080;

int main()
{
    //1.获取客户端版本信息
    std::cout << "mysql client Version " << mysql_get_client_info() << std::endl; 
    
    //2.初始化,获得一个句柄
    MYSQL* mySql = mysql_init(nullptr);
    if (mySql == nullptr)
    {
        std::cerr << "mysql_init() error" << std::endl;
        exit(1);
    }
    
    //3.修改本客户端的对应字符集,避免传输过程中出现乱码
    mysql_set_character_set(mySql, "utf8");

    //4.连接数据库
    if (mysql_real_connect(
        mySql, //内部包含套接字信息   
        host.c_str(), //连接主机 IP
        user.c_str(), //用户
        passwd.c_str(), //密码
        db.c_str(), //对应的数据库
        port, //端口号
        nullptr, //域间套接字
    	0 //客户端标志
    ) == nullptr)
    {
        std::cerr << "mysql_real_connrct() error" << std::endl;
        exit(2);
    }
    
    //5.操作数据库
    while(true)
    {
        std::string sql;
        
        std::cout << "insert sql >>> "; 
        
        if (!std::getline(std::cin, sql))
        {
            break;
        }
        
        if (sql == "quit" || sql == "exit")
        {
            std::cout << "bye~" << std::endl;
            break;
        }
        
        if (mysql_query(mySql, sql.c_str()) != 0)
        {
            std::cerr << "mysql_query() error" << std::endl;
            exit(3);
        }
         
        //6.读取
        if (sql.find("select") != std::string::npos) //有读取的命令
        {
            MYSQL_RES* res = mysql_store_result(mySql); //MYSQL_RES 是一个类型,指向的对象可以保存查询的数据,把数据全部当作字符串存储起来,可以看作一个 char** arr[],每个元素都是一个 char* arr[],实际上这些空间也是 new/malloc() 出来的,因此最后一定要记得释放

            if (res == nullptr)
            {
                std::cerr << "mysql_store_result() error" << std::endl;
                exit(4);
            }
            else
            {
                //读取行数和列数
                my_ulonglong rows = mysql_num_rows(res);
                my_ulonglong fields = mysql_num_fields(res);
                std::cout << "rows: " << rows << " and fields: " << fields << std::endl;

                //读取具体的列的属性
                MYSQL_FIELD* field_arry = mysql_fetch_fields(res); //该函数行为类似 C++ 的迭代器,每次遍历自动移动行
                for (int i = 0; i < fields; i++)
                {
                    std::cout << field_arry[i].name << "\t";
                }
                std::cout << "\n";

                //读取具体的行内内容
                for (int i = 0; i < rows; i++)
                {
                    MYSQL_ROW row = mysql_fetch_row(res); //该函数行为类似 C++ 的迭代器,每次遍历自动移动行
                    for (int j = 0; j < fields; j++)
                    {
                        std::cout << row[j] << "\t";
                    }
                    std::cout << "\n";
                }
                //实际上还可以通过 field_arry[index].属性 的方式获取值
                //若为 NULL 值则打印的结果为空
            }

            mysql_free_result(res);
        }
    }
    
    //7.释放句柄
    mysql_close(mySql);
    
    return 0;
}
# makefile 内部
mytest:main.cc
    g++ main.cc -o mytest -std=c++11 -L/lib64/mysql -lmysqlclient
    
.PHONY:clean
clean:
    rm -f mytest

补充:可以使用命令 show processlist; 来查看当前连接数据库的服务端及其用户信息。

# shell 的运行结果
# (1)插入数据
$ ./mytest
mysql client Version 5.7.44
insert sql >>> insert into test_table (name, age, telphone) values ('imou', 12, '10000');
insert sql >>> exit
bye~

# (2)检查结果
$ mysql -uroot -p

mysql> use conn
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show tables;
+----------------+
| Tables_in_conn |
+----------------+
| test_table     |
+----------------+
1 row in set (0.00 sec)

mysql> select * from test_table;
+----+-------+-----+----------+
| id | name  | age | telphone |
+----+-------+-----+----------+
|  1 | limou |  12 | 10000    |
+----+-------+-----+----------+
1 row in set (0.00 sec)

增删改都不难,但是如果查的结果?实际上就是存储在链接数据库时返回的指针变量中的成员。

另外,还有一些关于事务的接口,这里不再细谈。

3.图形化界面

还推荐使用一些图形化界面来操作数据库…

  • phpMyAdmin:好用,但是安装有点麻烦
  • Navicat:客户端体验不错,推荐,但是收费
  • SQLyong:体验也不错,推荐,但是收费
  • MySQL Workbench:官方推荐,但是体验可能一般,但是免费,可以先下载用一用,下载地址

在这里插入图片描述

图形界面实际上也是客户端。

一般云服务器的 MySQL 端口号不会暴露出来,基本都是在内网中开发,一般数据库会和其他服务器单独隔离开,单独购买一个机器。

但是由于条件受限,您可以在不重要的云服务器中暴露端口号,方便测试使用。

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Transformer中的FlashAttention

FlashAttention是一种用于Transformer模型的近似注意力机制&#xff0c;旨在减少注意力计算和内存需求。引入FlashAttention是因为传统Transformer模型中的自注意力机制在处理长序列时存在时间和存储复杂度上的挑战&#xff0c;需要大量的计算资源和内存来处理更长的上下文背景…

【数据结构】二、线性表:6.顺序表和链表的对比不同(从数据结构三要素讨论:逻辑结构、物理结构(存储结构)、数据运算(基本操作))

文章目录 6.对比&#xff1a;顺序表&链表6.1逻辑结构6.2物理结构&#xff08;存储结构&#xff09;6.2.1顺序表6.2.2链表 6.3数据运算&#xff08;基本操作&#xff09;6.3.1初始化6.3.2销毁表6.3.3插入、删除6.3.4查找 6.对比&#xff1a;顺序表&链表 6.1逻辑结构 顺…

禁闭室的乐趣

解法&#xff1a; 暴力 #include<iostream> #include<vector> #include<algorithm> using namespace std; #define endl \n bool cmp(string& a, string& b) {if (a.size() ! b.size())return a.size() > b.size(); } int main() {ios::sync_wi…

【李沐精读系列】GPT、GPT-2和GPT-3论文精读

论文&#xff1a; GPT&#xff1a;Improving Language Understanding by Generative Pre-Training GTP-2&#xff1a;Language Models are Unsupervised Multitask Learners GPT-3&#xff1a;Language Models are Few-Shot Learners 参考&#xff1a;GPT、GPT-2、GPT-3论文精读…

CentOS7 利用remi yum源安装php8.1

目录 前言remi yum源remi yum源 支持的操作系统remi yum源 支持的php版本 安装epel源安装remi源安装 php8.1查看php版本查看php-fpm服务启动php-fpm服务查看php-fpm服务运行状态查看php-fpm服务占用的端口查看 php8.1 相关的应用 前言 CentOS Linux release 7.9.2009 (Core) …

基于java springboot网上蛋糕商城项目设计和实现

基于java springboot网上蛋糕商城项目设计和实现 博主介绍&#xff1a;多年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源…

酷克数据荣获粤港澳大湾区金融创新成果“特优解决方案”奖

近日&#xff0c;“第二届金融创新优秀应用案例与解决方案技术成果评定”正式揭晓&#xff0c;酷克数据提交的“HashData云原生金融信创数据仓库”入选特优解决方案&#xff0c;成为数据治理与数据平台类目中唯一的厂商方案。 本次评定历时5个多月&#xff0c;共257个项目参与申…

了解开源可视化表单的主要优势

为什么可视化表单深受大家喜爱&#xff1f;这就需要了解开源可视化表单的优势和特点了。在流程化办公深入人心的今天&#xff0c;提高办公协作效率早已成为大家的发展目标&#xff0c;低代码技术平台、开源可视化表单是提升办公协作效率的得力助手&#xff0c;一起来看看它的优…

项目管理工具及模板(甘特图、OKR周报、任务管理、头脑风暴等)

项目管理常用模板大全&#xff1a; 1. 项目组OKR周报 2. 项目组传统周报工作法 3. 项目甘特图 4. 团队名单 5. 招聘跟进表 6. 出勤统计 7. 年度工作日历 8. 项目工作年计划 9. 版本排期 10. 项目组任务管理 11. 项目规划模板 12. 产品分析报告 13. 头脑风暴 信息化项目建设全套…

什么是TikTok账号权重?打破TikTok0播放的方法

许多TikTok账号运营者都会遇到一个难题&#xff0c;那就是视频要么播放量很低&#xff0c;要么0播放&#xff01;不管内容做的多好&#xff0c;最好都是竹篮打水一场空&#xff01;其实你可能忽略了一个问题&#xff0c;那就是账号权重。下面好好跟大家讲讲这个东西&#xff01…

5V转3.3V/2.5V/1.2V芯片PW2053,专为锂电池设计,低功耗外围简单

在现代电子设备领域&#xff0c;高效、稳定的电源管理至关重要。为了满足这一需求&#xff0c;我们向您隆重推荐PW2053高效同步降压调节器。这款调节器以其出色的性能和广泛的应用领域&#xff0c;赢得了市场的广泛认可。 一、产品描述 PW2053是一款采用恒定频率、电流模式架…

【操作系统概念】 第8章:内存管理

文章目录 0.前言8.1 背景8.1.1 基本硬件8.1.2 地址绑定8.1.3 逻辑地址空间和物理地址空间8.1.4 动态加载&#xff08;dynamic loading&#xff09;8.1.5 动态链接&#xff08;dynamically linking&#xff09;与共享库 8.3 连续内存分配&#xff08;contiguous memory allocati…

防御保护----IPSEC VPPN实验

实验拓扑&#xff1a; 实验背景&#xff1a;FW1和FW2是双机热备的状态。 实验要求&#xff1a;在FW和FW3之间建立一条IPSEC通道&#xff0c;保证10.0.2.0/24网段可以正常访问到192.168.1.0/24 IPSEC VPPN实验配置&#xff08;由于是双机热备状态&#xff0c;所以FW1和FW2只需要…

数据结构——二叉树 原理

1.树 ①树的概念 树是一种非线性的数据结构&#xff0c;它是由(>0)个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 有一个特殊的结点&#xff0c;称为根结点&#xff0c;根节点没…

CNC机加工引入复合机器人可以提高生产效率,降低成本

CNC加工企业在过去依赖大量的人工来完成生产线上的各项任务&#xff0c;包括CNC机床的上下料、物料搬运以及部分装配工作。然而&#xff0c;随着产能需求的不断增长和人工成本的持续上升&#xff0c;企业逐渐意识到自动化升级的重要性与迫切性。 面临的挑战与需求&#xff1a; …

分布式架构下 网络通信的底层实现原理(一)

什么是通信&#xff1f; 当我们通过浏览器访问一个网址时&#xff0c;一段时间后该网址会渲染出访问的内容&#xff0c;这个过程是怎么实现的呢&#xff1f; 这种通信方式是基于http协议实现的&#xff0c;那么什么是协议&#xff1f; 像一个中国人和一个外国人交流时&#xf…

人工智能(AI)与电网系统的结合

人工智能&#xff08;AI&#xff09;与电网系统的结合可以带来许多潜在的好处&#xff0c;包括提高电网的运行效率、安全性和可靠性。以下是一些主要的应用领域&#xff0c;希望对大家有所帮助。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交…

Codeforces Round 932 (Div. 2)C. Messenger in MAC 有序简化题目,dp,dp优化

Problem - C - Codeforces 目录 题意&#xff1a; 思路&#xff1a; 状态转移方程&#xff1a; 参考代码&#xff1a; 题意&#xff1a; 给两个长度为n数组a,b&#xff0c;和整数 l 任取若干下标&#xff0c;使得这个式子 不超过 l 的最多下标数。 思路&#xff1a; …

【干货】桌面运维当中,我最常见遇到的几个问题!

作为IT工程师&#xff0c;不管大小事凡是涉及到信息化相关的都会来找&#xff0c;平常碰到最多的当然是电脑使用方面的了&#xff0c;比如什么C盘满了需要帮忙清一下&#xff0c;电脑太慢了需要帮忙看看啥的&#xff0c;一般新来的小伙子们就会被分配去干这些事情&#xff0c;但…

git克隆过程报错

设置 git config 来强制 git 使用 HTTP 1.1 git config --global http.version HTTP/1.1想将其设置回 HTTP2&#xff0c;你可以这样做 git config --global http.version HTTP/2