首页 > 数据库 >通过C语言连接MySQL数据库

通过C语言连接MySQL数据库

时间:2023-12-08 18:15:49浏览次数:42  
标签:调用 数据库 MySQL C语言 init mysql NULL 连接

一、如何连接MySQL

首先需要安装MySQL

sudo apt-get update
sudo apt-get install mysql-server

C语言的API代码是与MySQL一起提供的,它包含在mysqlclient库中,并允许C程序访问数据库,如果安装MySQL后仍提示缺少库,则需要安装如下:

sudo apt-get install libmysqlclient-dev
sudo apt-get install libmysql++-dev

与MySQL交互时,应用程序应使用以下步骤:

  • 通过调用mysql_library_init(),初始化MySQL库。库可以是mysqlclient C客户端,或mysqld嵌入式服务器库,具体情况取决于应用程序是否与"-libmysqlclient"或"-libmysqld"标志连接。
  • 通过调用mysql_init()初始化连接处理程序,并通过调用mysql_connect()连接到服务器。
  • 发出SQL语句并处理其结果。
  • 通过调用mysql_close(),关闭于MySQL服务器的连接。
  • 通过调用mysql_library_end(),结束MySQL库的使用。

调用mysql_library_init()和mysql_library_end()的目的在于为MySQL库提供恰当的初始化和结束处理。对于与客户端库链接的应用程序,它们提供了改进的内存管理功能,如果不调用mysql_library_end(),内存块仍将保持分配状态(这不会增加应用程序的内存量,但某些内存泄漏器将会抗议它)。对于与嵌入式服务器链接的应用程序,这些调用会启动并停止服务器。mysql_library_init()和mysql_library_end()实际上是#define符号,这类符号使得它们等效于mysql_server_init()和mysql_server_end(),但其名称更清楚地指明,无论应用程序使用的mysqkclient或mysqld库,启动或结束MySQ库时,应用调用它们。对于早期的MySQL版本,可调用mysql_server_init()和mysql_server_end()取而代之。如果愿意,可省略对mysql_library_init()的调用,这是因为,必要时,mysql_init()会自动调用它。

二、相关函数介绍

1.mysql_init()

MYSQL *STDCALL mysql_init(MYSQL *mysql);

描述:分配或初始化与mysql_real_connect()相适应的MYSQL对象,如果mysql是NULL指针,该函数将分配、初始化、并返回新对象。否则,将初始化对象,并返回对象的地址,如果mysql_init()分配了新的对象,当调用mysql_close()来关闭连接时,将释放该对象。

返回值:初始化的MYSQL*句柄,如果无足够的内存以分配新的对象,返回NULL。

错误:在内存不足的情况下,返回NULL。

2.mysql_close()

void STDCALL mysql_close(MYSQL *sock);

描述:关闭前面打开的连接,如果句柄是由mysql_init()或mysql_connect()自动分配的,mysql_close()还将解除分配由mysql指向的连接句柄。

3.mysql_real_connect()

MYSQL *STDCALL mysql_real_connect(MYSQL *mysql, const char *host, const char *user, const char *passwd, const char *db, unsigned int port, const char *unix_socket, unsigned long clientflag);

描述:mysql_real_connect()尝试与运行在主机上的MySQL数据库引擎建立连接,在能够执行需要有效MySQL连接句柄结构的任何其他API函数之前,所有mysql_real_connect()必须成功完成。

参数的指定方式如下:

  • mysql:已有的MYSQL结构的地址,调用mysql_real_connect()之前,必须调用mysql_init()来初始化MYSQL结构。通过mysql_option()调用,可更改连接选项。
  • host:必须是主机名或IP地址,如果host是NULL或字符串"localhost",连接将被视为与本地主机的连接。
  • user:包含用户的MySQL登录ID,如果user是NULL或空字符串"",用户将被视为当前用户。在UNIX环境下,它是当前的登陆名。
  • passwd:包含用户的密码,如果passwd是NULL,仅会对该用户的(拥有1个空密码字段的)用户表中的条目进行匹配检查。这样,数据库管理员就能按特定的方式设置MySQL权限系统,根据用户是否拥有指定的密码,用户将获得不同的权限。
  • db:是数据库名称,如果db为NULL,连接会将默认的数据库设为该值。
  • port:如果port不是0,其值将用于TCP/IP连接的端口号,注意,"host"参数决定了连接的类型。
  • unix_socket:如果值不是NULL,该字符串描述了应使用的套接字或命名管道,注意,"host"参数决定了连接的类型。
  • clientflag:值通常为0。

对于某些参数,能够从选项文件获得取值,而不是取得mysql_real_connect()调用中的确切值,为此,在调用mysql_real_connect()之前,应与MYSQL_READ_DEFAULT_FILE或MYSQL_READ_DEFAULT_GROUP选项一起调用mysql_option()。随后,在mysql_real_connect()调用中,为准备选项文件读取值的每个参数指定"无值"值。

  • 对于host,指定NULL值或空字符串("")。
  • 对于user,指定NULL值或空字符串。
  • 对于passwd,指定NULL值。(对于密码,调用中的空字符串的值不能被选项文件中的字符串覆盖,这是因为空字符串明确指明MySQL账户必须由空密码)。
  • 对于db,指定NULL值或空字符串。
  • 对于port,指定"0"值。
  • 对于unix_socket,指定NULL值

对于某一参数,如果在选项文件中未发现值,将使用它的默认值。

返回值:如果连接成功,返回MYSQL*连接句柄,如果连接失败,返回NULL,对于成功的连接,返回值与第一个参数的值相同。  

错误:

  • CR_CONN_HOST_ERROR:无法连接到MySQL服务器。
  • CR_CONNECTION_ERROR:无法连接到本地MySQL服务器。 

示例如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <mysql/mysql.h>

#define HOST_IP     "localhost"
#define USER_NAME   "root"
#define USER_PWD    "Ke660812+"
#define DB_NAME     "mydb"

int main() {
    MYSQL *mysql = NULL;
    
	//初始化
	mysql = mysql_init(NULL);
    if (mysql == NULL) {
        printf("mysql_init failde...\n");

        return  -1;
    }
    printf("mysql_init successfully...\n");

    //连接数据库
    mysql = mysql_real_connect(mysql, HOST_IP, USER_NAME, USER_PWD, DB_NAME, 0, NULL, 0);
    if (mysql == NULL) {
        printf("mysql_real_connect failed...\n");

        return -1;
    }
    printf("mysql_real_connect successfully...\n");

    //关闭连接
    mysql_close(mysql);

    return 0;
}

  

标签:调用,数据库,MySQL,C语言,init,mysql,NULL,连接
From: https://www.cnblogs.com/TechNomad/p/17888767.html

相关文章

  • Redis生产实战-热key、大key解决方案、数据库与缓存最终一致性解决方案
    生产环境中热key处理热key问题就是某一瞬间可能某条内容特别火爆,大量的请求去访问这个数据,那么这样的key就是热key,往往这样的key也是存储在了一个redis节点中,对该节点压力很大那么对于热key的处理就是通过热key探测系统对热key进行计数,一旦发现了热key,就将热key......
  • JetBrains DataGrip 2023.3 (macOS, Linux, Windows) - 数据库和 SQL 跨平台 IDE
    JetBrainsDataGrip2023.3(macOS,Linux,Windows)-数据库和SQL跨平台IDE请访问原文链接:https://sysin.org/blog/jb-datagrip-2023/,查看最新版。原创作品,转载请保留出处。作者主页:sysin.orgJetBrainsDataGrip-多种数据库,一个工具为什么选择DataGrip轻松处理数据......
  • MySQL数据库-1
    MySQL数据库-11.为什么要使用数据库持久化(persistence):把数据保存到可掉电式存储设备中以供之后使用。大多数情况下,特别是企业级应用,数据持久化意味着将内存中的数据保存到硬盘上加以"固化”,而持久化的实现过程大多通过各种关系数据库来完成。持久化的主要作用是将内存中......
  • Mysql Full-Text Index 介绍
    MysqlFull-TextIndex介绍ngramFull-TextParser参考链接Thebuilt-inMySQLfull-textparserusesthewhitespacebetweenwordsasadelimitertodeterminewherewordsbeginandend,whichisalimitationwhenworkingwithideographiclanguagesthatdono......
  • 数据库数据恢复—无备份,binlog未开启的Mysql数据库误删表数据的数据恢复案例
    mysql数据库数据恢复环境:本地服务器,windowsserver操作系统,部署有mysql单实例,数据库引擎类型为innodb,独立表空间,无数据库备份,未开启binlog。mysql数据库故障:工作人员使用Delete命令删除数据时未添加where子句进行筛选,导致全表数据被删除,删除后未对该表进行任何操作。针对mysql......
  • 从ClickHouse通往MySQL的几条道路
    一、应用背景简介ClickHouse是Yandex(俄罗斯最大的搜索引擎)开源的一个用于实时数据分析的基于列存储的数据库,其处理数据的速度比传统方法快100-1000倍。ClickHouse的性能超过了目前市场上可比的面向列的DBMS,每秒钟每台服务器每秒处理数亿至十亿多行和数十千兆字节的数据。它......
  • 数据库工程师-Oracle OCP 19C认证介绍
    原创:厦门微思网络一、ORACLEOCP认证介绍OCP的英文全称是:OracleCertifiedProfessional,专家级技能和技术知识考试,通过这个考试,说明此人可以管理大型数据库,或者能够开发可以部署到整个企业的强大应用。要成为OCP,需要先获得OCA的认证,然后才能参加OCP考试。获得ORACLEOCP认证之后可......
  • Ubuntu安装MySQL数据库
    Ubuntu安装MySQL数据库介绍MySQL的定义MySQL是一种开源关系型数据库管理系统。与其他关系型数据库一样,MySQL将数据存储在由行和列组成的表中。用户可以使用结构化查询语言(通常称为SQL)定义、操作、控制和查询数据。由于MySQL是开源的,因此它的大量功能是在超过25年与用户......
  • C语言源码的陷波器设计及调试总结
    一前记音频信号处理中,限波器是一个常用的算法。这个算法难度不是很高,可用起来却坑很多。二源码解析1滤波器的核心函数,这里注意两点,一个是带宽不能太宽了,太宽了杀伤力太大了,容易出问题。另外一个就是滤波器的阶数非常重要,假如想滤波宽度尽量窄一些,那就阶数尽量高一些......
  • 数据库
    本单元目标一、为什么要学习数据库二、数据库的相关概念 DBMS、DB、SQL三、数据库存储数据的特点四、初始MySQL MySQL产品的介绍 MySQL产品的安装★ MySQL服务的启动和停止★ MySQL服务的登录和退出★ MySQL的常见命令......