MySQL C连接与使用

news/2024/9/23 8:02:21

目录
  • 使用C语言连接
    • 库的安装
    • C API
      • mysql_init
      • mysql_real_connect
      • mysql_close
      • mysql_query
      • mysql_set_character_set
      • mysql_store_result

使用C语言连接

mysql操作是线程安全的(事务)

以API路线认识mysql API的使用.

库的安装

如果是通过yum等安装方式安装的mysql,则在安装过程mysql开发包一般也安装好了,因此推荐这种方式安装mysql;

安装好后开发头文件目录位于/usr/include/mysql,库位于/usr/lib64/mysql

如果没有找到,说明可能没有安装,可以手动命令安装:

yum install -y mysql-community-devel			## 开发包

也可以单独下载mysql连接工具,MySQL :: Download MySQL Connector/C++ (Archived Versions);注意,如果能找到对应的版本是最好,不过现在旧版本官网可能不显示了,这个也无妨,mysql对新版本是能做到前后兼容的,因此可以下载推荐的8.x版本.这种方法缺点就是比较繁琐,还可能出现兼容性问题等,因此不是很推荐.

对下载下来的包中,目前最重要的是include文件夹与lib文件夹,有这两个目录就能C/C++连接数据库与开发.(需要动静态库系列知识)

linux generic: 通用版

C API

MySQL官方C接口声明

MySQL C 结构体

mysql_init

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.54 mysql_real_connect()

MYSQL* mysql_init(MYSQL *mysql);

顾名思义,对 MYSQL* 对象进行初始化.

mysql_real_connect

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.54 mysql_real_connect()

 MYSQL *mysql_real_connect(MYSQL *mysql,               // 输出型参数:成功则返回mysql访问句柄,错误返回NULL;const char *host,           // mysqld的ip        const char *user,           // 登录的用户名        const char *passwd,         // 登录密码        const char *db,             // 连接的数据库        unsigned int port,          // mysqld端口号        const char *unix_socket,    // 域间套接字(类似进程间管道通信)        unsigned long clientflag);  // 位图,启用一些特性;一般使用默认就好,即0

注意:

需要先使用mysql_init初始化MYSQL*对象.

返回值

如果连接成功,则使用MYSQL*连接处理程序,如果连接不成功,则为NULL。对于成功的连接,返回值与第一个参数的值相同。

mysql_close

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.5 mysql_close()

void mysql_close(MYSQL *mysql);

关闭

mysql_query

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.53 mysql_query()

int mysql_query(MYSQL *mysql,const char *stmt_str);

注意:

官方文档中描述说到,不用在sql语句后面加上';'和'\G'

返回值:

成功返回0,失败返回错误码

模拟实现一个简单的MySQL客户端:

#include<iostream>
#include<mysql/mysql.h>
#include<string>
#include<cassert>
#include<chrono>
#include<thread>/*
MYSQL *mysql_real_connect(MYSQL *mysql,               // 输出型参数:成功则返回mysql访问句柄,错误返回NULLconst char *host,           // mysqld的ip
        const char *user,           // 登录的用户名
        const char *passwd,         // 登录密码
        const char *db,             // 连接的数据库
        unsigned int port,          // mysqld端口号
        const char *unix_socket,    // 域间套接字(类似进程间管道通信)
        unsigned long clientflag);  // 位图,启用一些特性;一般使用默认就好,即0*/const std::string host = "127.0.0.1";
const std::string user = "chj";
const std::string passwd = "123456";
const std::string db = "test_db";
const unsigned int port = 3306;
//const std::string socket = ;
const unsigned long clientflag = 0;int main(){std::cout<<"mysql client version :" << mysql_get_client_info()<<std::endl;MYSQL* mysql = mysql_init(nullptr);if(mysql == nullptr){std::cerr<<" mysql init error "<<std::endl;return 1;}if(mysql_real_connect(mysql,host.c_str(),user.c_str(),passwd.c_str(),db.c_str(),port,nullptr,clientflag)){std::cout<<"conect success" <<std::endl;}else{std::cerr<<"mysql connect error"<<std::endl;return 2;}std::string sql;while(true){std::cout<<"mysql >>> ";if(!std::getline(std::cin,sql)) break;if(sql == "quit" || sql == "exit") break;int n = mysql_query(mysql,sql.c_str());if(n == 0){std::cout<<sql<<" sucess"<<std::endl;}else{std::cerr<<sql<<" failed, "<<n<<std::endl;}}mysql_close(mysql);return 0;
}

mysql_set_character_set

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.69 mysql_set_character_set()

int mysql_set_character_set(MYSQL *mysql,const char *csname);	//cs == character set

问题: 一般来说,mysqld也是设置成utf8的,C/C++代码也是utf8的,为什么中文可能会出现乱码呢?

解析: 两端都没问题,那问题只能出自于链接,因此需要设置链接字符集

建立好链接之后,获取英文没有问题,如果获取中文是乱码:
设置链接的默认字符集是utf8,原始默认是latin1
mysql_set_character_set(myfd, "utf8");

mysql_store_result

MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.77 mysql_store_result()

MYSQL_RES *mysql_store_result(MYSQL *mysql);

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

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

相关文章

Adobe Photoshop 2024 v25.12 (macOS, Windows) 发布下载 - 照片和设计软件

Adobe Photoshop 2024 v25.12 (macOS, Windows) 发布下载 - 照片和设计软件Adobe Photoshop 2024 v25.12 (macOS, Windows) - 照片和设计软件 Acrobat、After Effects、Animate、Audition、Bridge、Character Animator、Dimension、Dreamweaver、Illustrator、InCopy、InDesig…

基础数据结构之数组

数组 1) 概述 定义 在计算机科学中,数组是由一组元素(值或变量)组成的数据结构,每个元素有至少一个索引或键来标识In computer science, an array is a data structure consisting of a collection of elements (values or variables), each identified by at least one ar…

网站搭建

第一步,服务器申请选择一:免费云服务器,免费虚拟主机 如:阿贝云阿贝云提供了免费的云服务器和免费的云虚拟主机,可根据自己的实际应用情况选择。 首先注册一个账户,然后需要支付0.3元做一个实名认证,如果实名认证成功了大概率会开通成功。如果失败了可能是服务器资源池不…

读构建可扩展分布式系统:方法与实践12分布式数据库案例

分布式数据库案例1. Redis 1.1. 2009年首次发布1.1.1. 更注重原始性能和简单性,而不是数据安全性和一致性1.2. 主要吸引力在于它能够同时充当分布式缓存和数据存储 1.3. 维护一个内存中的数据存储,也称为数据结构存储(data structure store) 1.4. 配置Redis将每个命令记录到一…

python-集合set

集合:可变数据类型,但是它里面的元素必须是不可变数据类型

Java代码审计篇 - ofcms系统审计思路讲解 - 篇2 - SQL注入漏洞审计

Java代码审计篇 | ofcms系统审计思路讲解 - 篇2 | SQL注入漏洞审计 1. 前言 我发现很多文章包括教程,大概套路是:只说有漏洞的点,将有漏洞的点指出,然后分析代码;或者黑盒测试出漏洞之后,然后分析代码。 我认为这是在分析漏洞代码,而非代码审计。代码审计文章或教程应该…

Java代码审计篇 - ofcms系统审计思路讲解 - 篇3 - 文件上传漏洞审计

Java代码审计篇 | ofcms系统审计思路讲解 - 篇3 | 文件上传漏洞审计 1 文件上传代码审计【有1处】 文件上传漏洞我们需要着重关注的是文件在被java代码解析到保存下来之间有无验证过滤,因此什么样的上传方式,什么样的保存方式都不重要,大家着重关注代码对文件的验证过滤手段…

Java代码审计篇 - ofcms系统审计思路讲解 - 篇4 - XXE漏洞审计

Java代码审计篇 | ofcms系统审计思路讲解 - 篇4 | XXE漏洞审计 1. XXE代码审计【有1处】 XXE代码审计常搜索的关键字如下: XMLReader SAXBuilder SAXReader SAXParserFactory Digester DocumentBuilderFactory ...还有一个特殊的,用于加载.jrxml 文件,这是 JasperReports 特…