一、如何连接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