一、TheMySQLCAPI编程实例在网上找了一些MYSQLCAPI编程的文章,如《TheMySQLCAPI编程实例》,看了后觉得还是写的不够充分,根据自己经验又扩充了一些知识,希望对需要调用到MYSQL的C的API的朋友有所帮助,附例中的环境为centos7,mysql为5.6.21,版本不同也可。在这篇文章里,我们将学会怎么使用MySQL的CAPIs(ApplicationProgrammingInterfaces编程接口),当然还有PreparedStatement,自己可查看mysqlapi的帮助文档部分。为了很好地了解这篇文章,您需要具备以下前提知识:C语言变量C语言函数C语言指针简介1.linux下mysql安装。参见网址,mysql的三种安装方式:RPM二进制包和源代码。mysql也是一个服务器,需要运行。2.linux下mysql命令运用。在ssh中远程登录服务器:mysql-h192.168.1.112-uusername-ppassword,当然如果服务器的mysql需要设置权限。mysqlshowdatabases;显示系统中所有数据库。mysqlusedbnameUSEdb_name语句告诉mysql使用db_name数据库作为随后的查询的缺省数据库。进去数据库之后就可以进行相应的数据库操作,createdatabase,createtabel,alter/droptable,delete、select、join、insert、replace等语句。一些语句:mysqlcreatetablet_zz(id1intnotnull,moneydoublenotnull,id2intnull,id3intnull,primarykey(id1,id2,id3));mysqlshowcolumnsfromt_ad;mysqlshowcolumnsfromt_ad;+-------------+-----------+------+-----+---------+-------+|Field|Type|Null|Key|Default|Extra|+-------------+-----------+------+-----+---------+-------+|id|int(11)|NO|PRI||||name|char(100)|YES||NULL|||type|char(1)|NO||||.....+-------------+-----------+------+-----+---------+-------+12rowsinset(0.00sec)mysqlaltertablet_usertobaddyestodaynumdoublenotnull;mysqlcreateclusterindexont_usertob(dealtimeDESC);mysqlinsertintot_tmpvalues('15','比','1',NULL,122,122,NULL,NULL,4263,2222222,'随便',10);3.linuxc——mysql编程CAPIs包含在mysqlclient库文件当中与MySQL的源代码一块发行,用于连接到数据库和执行数据库查询。有一些例子在MySQL原代码的clients目录里。我们可以手动建立数据库,建表或者插入语句,大多数其他客户API都使用mysqlclient库与mysql服务器通信。客户有一个最大通讯缓冲区大小。初始分配的缓冲区大小(16K字节)自动地增加到最大尺寸(缺省的最大值是24M)。因为缓冲区大小只是按保证需求而被增加,简单地增加缺省的最大限制并不造成更多被消耗。该尺寸检查主要是一个对错误的查询和通讯包的检查。通讯缓冲区必须足够大以便一个单独的SQL语句(对客户-服务器传输)和一行返回的数据(对服务器-客户传输)。每个线程的通讯缓冲区被动态扩大到最大限制来处理任何查询或行。例如,如果你包含大到16M数据的BLOB值,你必须有一个至少16M通讯缓冲区限制(在服务器和客户两端)。客户的缺省最大值是24M,但是在服务器端的缺省最大值是1M。你可以在服务器启动时通过改变max_allowed_packet参数的值来改变它。mysql服务器在每个查询后缩小每个通讯缓冲区到net_buffer_length个字节。对客户,与一个连接相关的缓冲区的大小没被减少,直到连接被关闭,在此时客户内存被回收。如果你用线程的编程,你应该用--with-thread-safe-client编译mysqlCAPI,这将使CAPI线程对每个连接更安全。你可以让2个线程共享相同的连接,只要如果你做下列事情:两个线程不能同时在同一个连接上发送查询到mysql。特别是你必须保证在一个mysql_query()和mysql_store_result()之间没有其他线程正在使用同一个连接。许多线程能存取用mysql_store_result()检索出来的不同结果集合。如果你使用mysql_use_result,你必须保证没有其他线程在同一个连接上正在询问任何东西,直到结果集合被关闭。MySQLC变量类型以下变量类型在MySQL的库当中定义。我们需要这些变量是为了使用MySQL的函数。这些变量有详细的解释,但是这些解释对于写代码来说并不重要。MYSQL以下代码块是用来连接数据库的通讯过程,要连接MYSQL,必须建立MYSQL实例,通过mysql_init初始化方能开始进行连接,这个在后面会讲到。typedefstructst_mysql{NETnet;/*Communicationparameters*/gptrconnector_fd;/*ConnectorFdforSSL*/char*host,*user,*passwd,*unix_socket,*server_version,*host_info,*info,*db;unsignedintport,client_flag,server_capabilities;unsignedintprotocol_version;unsignedintfield_count;unsignedintserver_status;unsignedlongthread_id;/*Idforconnectioninserver*/my_ulonglongaffected_rows;my_ulonglonginsert_id;/*idifinsertontablewithNEXTNR*/my_ulonglongextra_info;/*Usedbymysqlshow*/unsignedlongpacket_length;enummysql_statusstatus;MYSQL_FIELD*fields;MEM_ROOTfield_alloc;my_boolfree_me;/*Iffreeinmysql_close*/my_boolreconnect;/*setto1ifautomaticreconnect*/structst_mysql_optionsoptions;charscramble_buff[9];structcharset_info_st*charset;unsignedintserver_language;}MYSQL;MYSQL_RES这个结构代表返回行的一个查询的(SELECT,SHOW,DESCRIBE,EXPLAIN)的结果。返回的数据称为“数据集”,用过数据库的朋友应该对数据库中查询后得到的结果集不会陌生,在C的API里对应的就是MYSQL_RES了,从数据库读取数据,最后就是从MYSQL_RES中读取数据。typedefstructst_mysql_res{my_ulonglongrow_count;unsignedintfield_count,current_field;MYSQL_FIELD*fields;MYSQL_DATA*data;MYSQL_ROWS*data_cursor;MEM_ROOTfield_alloc;MYSQL_ROWrow;/*Ifunbufferedread*/MYSQL_ROWcurrent_row;/*buffertocurrentrow*/unsignedlong*lengths;/*columnlengthsofcurrentrow*/MYSQL*handle;/*forunbufferedreads*/my_booleof;/*Usedmymysql_fetch_row*/}MYSQL_RES;MYSQL_ROW这是一个行数据的类型安全(type-safe)的表示。当前它实现为一个计数字节的字符串数组。(如果字段值可能包含二进制数据,你不能将这些视为空终止串,因为这样的值可以在内部包含空字节)行通过调用mysql_fetch_row()获得。typedefchar**MYSQL_ROW;MYSQL_FIELD这个结构包含字段信息,例如字段名、类型和大小。其成员在下面更详细地描述。你可以通过重复调用mysql_fetch_field()对每一列获得MYSQL_FIELD结构。字段值不是这个结构的部分;他们被包含在一个MYSQL_ROW结构中。typedefstructst_mysql_field{char*name;/*Nameofcolumn*/char*table;/*Tableofcolumnifcolumnwasafield*/char*def;/*Defaultvalue(setbymysql_list_fields)*/enumenum_field_typestype;/*Typeoffield.Semysql_com.hfortypes*/unsignedintlength;/*Widthofcolumn*/unsignedintmax_length;/*Maxwidthofselectedset*/unsignedintflags;/*Divflags*/unsignedintdecimals;/*Numberofdecimalsinfield*/}MYSQL_FIELD;my_ulonglongtypedefunsignedlongmy_ulonglong;该类型用于行编号和mysql_affected_rows()、mysql_num_rows()和mysql_insert_id()。这种类型提供0到1.84e19的一个范围。在一些系统上,试图打印类型my_ulonglong的值将不工作。为了打印出这样的值,将它变换到unsignedlong并且使用一个%lu打印格式。例如:printf(Numberofrows:%lu\n,(unsignedlong)mysql_num_rows(result));连接MySQL,查询数据现在假设MySQL已安装,用户和数据表在数据库被创造。以防有什么不明问题的情况,请参考网站。前面已经说过,MySQL的库文件在mysqlclient。因此在编译MySQL程序的时候有必要加上-lmysqlclient编译选项。MySQL的头文件在/usr/include/mysql目录下(根据Linux的发行版本的不同,这个目录也有所不同),因此你的程序头部看起来有点这个样子:#includemysql.hMySQL的变量类型和函数都包含在这个头文件当中然后,我们需要创建连接数据库的变量,可以简单地这么做:MYSQLmysql;在连接数据库之前,我们要调用以下函数初始化这个变量:mysql_init(&mysql);然后,调用mysql_real_connect函数:MYSQL*STDCALLmysql_real_connect(MYSQL*mysql,constchar*host,constchar*user,constchar*pa