MySql数据库是一个典型的C/S结构,包括客户端和服务器。当部署好了MySql服务器,想通过程序访问服务端的数据,在编写程序的时候,可以通过官方提供的C语言API来实现。
在程序中连接MySql服务器主要分为以下几个步骤:
MYSQL* mysql_init(MYSQL* mysql)
参数:mysql填写null
返回值:返回一个MYSQL初始化的新对象地址。可以用该指针来连接MySql服务器,并操作对应数据库。如果没有足够内存分配新对象,返回NULL。
实际是用结构体对MySql数据库进行描述,实例化并初始化该类型的对象,在内存中开辟空间。
- MYSQL* mysql_real_connect(
- MYSQL* mysql, //mysql_init()函数返回值
- const char* host, //mysql服务器主机地址,写IP地址即可
- //localhost,null 代表本地连接
- const char* user, //连接mysql服务器的用户名,默认root
- const char* passwd, //对应用户名的密码
- const char* db, //要操作的数据库名
- unsigned int port, //连接的mysql服务器监听的端口
- //==0使用默认端口3306,
- const char* unix_socket, //本地套接字,不使用指定为NULL
- unsigned long client_flag//通常指定为0
- );
作用:连接对应ip主机上对应端口的mysql服务。
返回值:
成功:返回MYSQL*连接句柄,与函数的第一个参数值相同。指向同一块空间。
失败:返回NULL
int mysql_query(MYSQL* mysql, const char* query);
参数:
mysql:mysql_real_connect()返回值
query:增删查改的sql语句,结尾不需要加 ';'
返回值:
如果执行成功,返回0。如果是查询,结果集保存在mysql对象中。
如果出错,返回非0值。
MYSQL_RES* mysql_store_result(MYSQL* mysql);
作用:将结果集从参数(mysql)对象中取出。得到所有信息。
返回值:具有多个结果的MYSQL_RES结果的集合。出现错误返回NULL。
说明:
1. 结果集用MYSQL_RES描述。调用该函数,在内存中新开辟空间,里面保存从参数mysql取出的结果集。
2. 结果集中包括行和列的数据,(相当于一个二维数组)。找到某一个数据,就是找到对应行和列的位置。将行和列的数据从结果集中取出,需要使用其他函数。
unsigned int mysql_num_fields(MYSQL_RES* result);
作用:获得结果集中列的个数。
参数:调用mysql_store_result()得到的返回值。
返回值:结果集中的列数。
比如下面数据库中的表,调用该函数会返回4列。
MYSQL_FIELD* mysql_fetch_fields(MYSQL_RES* result);
参数:mysql_store_result()函数返回值。
返回值:返回一个结构体指针(数组),保存结果集中的所有列信息。该结构体描述的是返回结果集中的列信息。
返回值 MYSQL_FIELD 对应的是一个结构体,在 mysql.h 中定义如下:
- // mysql.h
- // 结果集中的每一个列对应一个 MYSQL_FIELD
- typedef struct st_mysql_field {
- char *name; /* 列名-> 字段的名字 */
- char *org_name; /* Original column name, if an alias */
- char *table; /* Table of column if column was a field */
- char *org_table; /* Org table name, if table was an alias */
- char *db; /* Database for table */
- char *catalog; /* Catalog for table */
- char *def; /* Default value (set by mysql_list_fields) */
- unsigned long length; /* Width of column (create length) */
- unsigned long max_length; /* Max width for selected set */
- unsigned int name_length;
- unsigned int org_name_length;
- unsigned int table_length;
- unsigned int org_table_length;
- unsigned int db_length;
- unsigned int catalog_length;
- unsigned int def_length;
- unsigned int flags; /* Div flags */
- unsigned int decimals; /* Number of decimals in field */
- unsigned int charsetnr; /* Character set */
- enum enum_field_types type; /* Type of field. See mysql_com.h for types */
- void *extension;
- } MYSQL_FIELD;
举例:获得结果集中的所有列名。
- //获得所有结果集的列信息
- MYSQL_FIELD* fields = mysql_fetch_fields(res);
- //获得列数
- unsigned int num = mysql_num_fields(res);
-
- for(int i = 0; i < num; ++i)
- {
- printf(""当前列的名字: %s\n", fields[i].name);
- }
- typedef char** MYSQL_ROW;
-
- MYSQL_ROW mysql_fetch_row(MTSQL_RES* result);
参数:通过查询得到的结果集
返回值:
成功得到当前行所有列的字段
失败返回NULL,说明数据读完了。
说明:
1. 返回值类型为char**,实际是char* [],数组里面保存的是当前行所有列的值。所有,对返回值遍历,可以得到当前行的所有值。
2. 如果想遍历郑国结果集,即得到所有结果,需要循环调用该函数,走到下一行,直到走到NULL。
unsigned long* mysql_fetch_lengths(MYSQL_RES* result);
作用:获得结果集当前行,所有列的数据的字段长度。
返回值:是一个数组,保存当前行所有列数据的长度。失败返回null。
说明:为什么需要这个接口,由于C语言中字符串以'\0'结尾,当保存的数据是二进制形式时,可能中间保存着的值为'\0',安装字符串读取时导致后面的字符丢失了。
1. 如果打算复制字段值,使用strlen()计算长度,二进制形式保存的数据,可能导致数据丢失。
2. 该接口可以正确返回字符串长度,不管中间有没有'\0'。
需要回收的资源:
1. 初始化Mysql时开辟的空间,即mysql实例对象。
2. 返回的结果集。
列名和数据值不需要释放,因为实际指向的空间都是结果集中的。
- // 释放结果集
- void mysql_free_result(MYSQL_RES *result);
-
- // 关闭mysql实例
- void mysql_close(MYSQL *mysql);
设置编码形式为UTF-8,避免中文出现乱码。
- // 获取api默认使用的字符编码
- // 为当前连接返回默认的字符集。
- const char *mysql_character_set_name(MYSQL *mysql)
- // 返回值: 默认字符集。
-
- // 设置api使用的字符集
- // 第二个参数 csname 就是要设置的字符集 -> 支持中文: utf8
- int mysql_set_character_set(MYSQL *mysql, char *csname);
- // mysql中默认会进行事务的提交
- // 因为自动提交事务, 会对我们的操作造成影响
- // 如果我们操作的步骤比较多, 集合的开始和结束需要用户自己去设置, 需要改为手动方式提交事务
- my_bool mysql_autocommit(MYSQL *mysql, my_bool mode)
参数:
如果模式为“1”,启用autocommit模式;如果模式为“0”,禁止autocommit模式。
如果我们要开启一个事务,并且会进行多次增删改操作,一般我们禁用autocommit模式。
返回值:
如果成功,返回0,如果出现错误,返回非0值。
- // 事务提交
- my_bool mysql_commit(MYSQL *mysql);
- 返回值: 成功: 0, 失败: 非0
-
- // 数据回滚
- my_bool mysql_rollback(MYSQL *mysql)
- 返回值: 成功: 0, 失败: 非0
- // 返回错误的描述
- const char *mysql_error(MYSQL *mysql);
- // 返回错误的编号
- unsigned int mysql_errno(MYSQL *mysql);