MYSQL *mysql_init(MYSQL *mysql) 描述 分配或初始化与mysql_real_connect()相适应的MYSQL对象。若是mysql是NULL指针,该函数将分配、初始化、并返回新对象。不然,将初始化对象,并返回对象的地址。若是mysql_init()分配了新的对象,当调用mysql_close()来关闭链接时。将释放该对象。 返回值 初始化的MYSQL*句柄。若是无足够内存以分配新的对象,返回NULL。 错误 在内存不足的状况下,返回NULL。
MYSQL *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 client_flag)
mysql_real_connect()尝试与运行在主机上的MySQL数据库引擎创建链接。在你可以执行须要有效MySQL链接句柄结构的任何其余API函数以前,mysql_real_connect()必须成功完成。 参数的指定方式以下: · 第1个参数应是已有MYSQL结构的地址。调用mysql_real_connect()以前,必须调用mysql_init()来初始化MYSQL结构。经过mysql_options()调用,可更改多种链接选项。请参见25.2.3.48节,“mysql_options()”。 · “host”的值必须是主机名或IP地址。若是“host”是NULL或字符串"localhost",链接将被视为与本地主机的链接。若是操做系统支持套接字(Unix)或命名管道(Windows),将使用它们而不是TCP/IP链接到服务器。 · “user”参数包含用户的MySQL登陆ID。若是“user”是NULL或空字符串"",用户将被视为当前用户。在UNIX环境下,它是当前的登陆名。在Windows ODBC下,必须明确指定当前用户名。请参见26.1.9.2节,“在Windows上配置MyODBC DSN”。 · “passwd”参数包含用户的密码。若是“passwd”是NULL,仅会对该用户的(拥有1个空密码字段的)用户表中的条目进行匹配检查。这样,数据库管理员就能按特定的方式设置MySQL权限系统,根据用户是否拥有指定的密码,用户将得到不一样的权限。 注释:调用mysql_real_connect()以前,不要尝试加密密码,密码加密将由客户端API自动处理。 · “db”是数据库名称。若是db为NULL,链接会将默认的数据库设为该值。 · 若是“port”不是0,其值将用做TCP/IP链接的端口号。注意,“host”参数决定了链接的类型。 · 若是unix_socket不是NULL,该字符串描述了应使用的套接字或命名管道。注意,“host”参数决定了链接的类型。 · client_flag的值一般为0,可是,也能将其设置为下述标志的组合,以容许特定功能:
标志名称mysql |
标志描述linux |
CLIENT_COMPRESSsql |
使用压缩协议。数据库 |
CLIENT_FOUND_ROWS数组 |
返回发现的行数(匹配的),而不是受影响的行数。服务器 |
CLIENT_IGNORE_SPACEsocket |
容许在函数名后使用空格。使全部的函数名成为保留字。函数 |
CLIENT_INTERACTIVE性能 |
关闭链接以前,容许interactive_timeout(取代了wait_timeout)秒的不活动时间。客户端的会话wait_timeout变量被设为会话interactive_timeout变量的值。fetch |
CLIENT_LOCAL_FILES |
容许LOAD DATA LOCAL处理功能。 |
CLIENT_MULTI_STATEMENTS |
通知服务器,客户端可能在单个字符串内发送多条语句(由‘;’隔开)。若是未设置该标志,将禁止多语句执行。 |
CLIENT_MULTI_RESULTS |
通知服务器,客户端可以处理来自多语句执行或存储程序的多个结果集。若是设置了CLIENT_MULTI_STATEMENTS,将自动设置它。 |
CLIENT_NO_SCHEMA |
禁止db_name.tbl_name.col_name语法。它用于ODBC。若是使用了该语法,它会使分析程序生成错误,在捕获某些ODBC程序中的缺陷时,它颇有用。 |
CLIENT_ODBC |
客户端是ODBC客户端。它将mysqld变得更为ODBC友好。 |
CLIENT_SSL |
使用SSL(加密协议)。该选项不该由应用程序设置,它是在客户端库内部设置的。 |
返回值 若是链接成功,返回MYSQL*链接句柄。若是链接失败,返回NULL。对于成功的链接,返回值与第1个参数的值相同。
int mysql_query(MYSQL *mysql, const char *query) 描述 执行由“Null终结的字符串”查询指向的SQL查询。正常状况下,字符串必须包含1条SQL语句,并且不该为语句添加终结分号(‘;’)或“\g”。若是容许多语句执行,字符串可包含多条由分号隔开的语句。请参见25.2.9节,“多查询执行的C API处理”。 mysql_query()不能用于包含二进制数据的查询,应使用mysql_real_query()取而代之(二进制数据可能包含字符‘\0’,mysql_query()会将该字符解释为查询字符串结束)。 若是但愿了解查询是否应返回结果集,可以使用mysql_field_count()进行检查。请参见25.2.3.22节,“mysql_field_count()”。 返回值 若是查询成功,返回0。若是出现错误,返回非0值。 查询的结果须要mysql_store_result来获取。查询的结果经过结构体mysql关联。
此时应该注意,查询的结果有多是多行。
应该调用函数mysql_field_count()返回表的列数。
能够调用函数mysql_fetch_row()来获取多行结果的一行内容。
能够经过函数mysql_fetch_fields()来获取表头的内容。
MYSQL_RES *mysql_store_result(MYSQL *mysql) 描述 对于成功检索了数据的每一个查询(SELECT、SHOW、DESCRIBE、EXPLAIN、CHECK TABLE等),必须调用mysql_store_result()或mysql_use_result() 。 对于其余查询,不须要调用mysql_store_result()或mysql_use_result(),可是若是在任何状况下均调用了mysql_store_result(),它也不会致使任何伤害或性能下降。经过检查mysql_store_result()是否返回0,可检测查询是否没有结果集(之后会更多)。 若是但愿了解查询是否应返回结果集,可以使用mysql_field_count()进行检查。请参见25.2.3.22节,“mysql_field_count()”。 mysql_store_result()将查询的所有结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。 若是查询未返回结果集,mysql_store_result()将返回Null指针(例如,若是查询是INSERT语句)。 若是读取结果集失败,mysql_store_result()还会返回Null指针。经过检查mysql_error()是否返回非空字符串,mysql_errno()是否返回非0值,或mysql_field_count()是否返回0,能够检查是否出现了错误。 若是未返回行,将返回空的结果集。(空结果集设置不一样于做为返回值的空指针)。 一旦调用了mysql_store_result()并得到了不是Null指针的结果,可调用mysql_num_rows()来找出结果集中的行数。 能够调用mysql_fetch_row()来获取结果集中的行,或调用mysql_row_seek()和mysql_row_tell()来获取或设置结果集中的当前行位置。 一旦完成了对结果集的操做,必须调用mysql_free_result()。 请参见25.2.13.1节,“为何在mysql_query()返回成功后,mysql_store_result()有时会返回NULL”. 返回值 具备多个结果的MYSQL_RES结果集合。若是出现错误,返回NULL。
unsigned int mysql_field_count(MYSQL *mysql) 描述 返回做用在链接上的最近查询的列数。 该函数的正常使用是在mysql_store_result()返回NULL(于是没有结果集指针)时。在这种状况下,可调用mysql_field_count()来断定mysql_store_result()是否应生成非空结果。这样,客户端就能采起恰当的动做,而无需知道查询是不是SELECT(或相似SELECT的)语句。在这里给出的示例中,演示了完成它的方法。 请参见25.2.13.1节,“为何在mysql_query()返回成功后,mysql_store_result()有时会返回NULL”. 返回值 表示结果集中列数的无符号整数。 错误 无。
MYSQL_ROW 是char ** 类型; MYSQL_ROW mysql_fetch_row(MYSQL_RES *result) 描述 检索结果集的下一行。在mysql_store_result()以后使用时,若是没有要检索的行,mysql_fetch_row()返回NULL。在mysql_use_result()以后使用时,若是没有要检索的行或出现了错误,mysql_fetch_row()返回NULL。 行内值的数目由mysql_num_fields(result)给出。若是行中保存了调用mysql_fetch_row()返回的值,将按照row[0]到row[mysql_num_fields(result)-1],访问这些值的指针。行中的NULL值由NULL指针指明。 能够经过调用mysql_fetch_lengths()来得到行中字段值的长度。对于空字段以及包含NULL的字段,长度为0。经过检查字段值的指针,可以区分它们。若是指针为NULL,字段为NULL,不然字段为空。 返回值 下一行的MYSQL_ROW结构。若是没有更多要检索的行或出现了错误,返回NULL。 错误 注意,在对mysql_fetch_row()的两次调用之间,不会复位错误。 · CR_SERVER_LOST 在查询过程当中,与服务器的链接丢失。 · CR_UNKNOWN_ERROR 出现未知错误。
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *result) 描述 对于结果集,返回全部MYSQL_FIELD结构的数组。每一个结构提供告终果集中1列的字段定义。 返回值 关于结果集全部列的MYSQL_FIELD结构的数组。 错误 无。 示例: unsigned int num_fields; unsigned int i; MYSQL_FIELD *fields; num_fields = mysql_num_fields(result); fields = mysql_fetch_fields(result); for(i = 0; i < num_fields; i++) { printf("Field %u is %s\n", i, fields[i].name); }
void mysql_free_result(MYSQL_RES *result) 描述 释放由mysql_store_result()、mysql_use_result()、mysql_list_dbs()等为结果集分配的内存。完成对结果集的操做后,必须调用mysql_free_result()释放结果集使用的内存。 释放完成后,不要尝试访问结果集。 返回值 无。 错误 无。
void mysql_close(MYSQL *mysql) 描述 关闭前面打开的链接。若是句柄是由mysql_init()或mysql_connect()自动分配的,mysql_close()还将解除分配由mysql指向的链接句柄。 返回值 无。 错误 无。
select * from department;
/************************************************************************* > File Name:mysql_test.c > Author: > Mail: > Created Time: 2016年02月11日 星期四 10时45分31秒 ************************************************************************/ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <mysql/mysql.h> int main() { int ret = 0; MYSQL mysql; MYSQL * connect = NULL; connect = mysql_init(&mysql); if(connect == NULL){ ret = mysql_errno(&mysql); printf("mysql_init error, %s\n", mysql_error(&mysql)); return ret; } printf("mysql_init ok...\n"); //connect = mysql_real_connect(connect, NULL, "root", "yxk", "mydb61", 0, NULL, 0); connect = mysql_real_connect(connect, "localhost", "root", "yxk", "test", 0, NULL, 0); if(connect == NULL){ ret = mysql_errno(&mysql); printf("mysql_real_connect error, err is: %s\n", mysql_error(&mysql)); return ret; } printf("mysql_real_connect ok...\n"); const char * query = "select * from department"; ret = mysql_query(connect, query); if(ret != 0){ printf("mysql_query error\n"); return ret; } MYSQL_RES *result = mysql_store_result(&mysql); if(result == NULL){ printf("mysql_store_result error\n"); return -1; } int field_num = mysql_field_count(&mysql); //表头 MYSQL_FIELD * fields = mysql_fetch_fields(result); int i = 0; printf("------------------------------------------\n"); for(i= 0; i < field_num; i++){ printf("%s \t", fields[i].name); } printf("\n------------------------------------------\n"); //表内容 MYSQL_ROW row = NULL; while(row = mysql_fetch_row(result)){ for(i= 0; i < field_num; i++){ printf("%s \t", row[i]); } printf("\n"); } mysql_free_result(result);//释放内存 mysql_close(connect); printf("mysql_close...\n"); return ret; }
Makefile文件:
mysql_test:mysql_test.c gcc mysql_test.c -o mysql_test -I/usr/include/ -L/usr/lib/x86_64-linux-gnu/ -lmysqlclient clean: rm mysql_test
运行输出结果: