Chinaunix首页 | 论坛 | 博客
  • 博客访问: 475380
  • 博文数量: 133
  • 博客积分: 1235
  • 博客等级: 少尉
  • 技术积分: 1201
  • 用 户 组: 普通用户
  • 注册时间: 2010-09-08 19:59
文章分类

全部博文(133)

文章存档

2023年(12)

2022年(3)

2018年(2)

2017年(4)

2016年(4)

2015年(42)

2014年(1)

2013年(12)

2012年(16)

2011年(36)

2010年(1)

分类: 其他平台

2015-04-10 13:10:48

 C API Function Descriptions

http://dev.mysql.com/doc/refman/5.1/en/c-api-functions.html


1.  通过yum来进行mysql的安装

    #yum install -y mysql-server mysql mysql-deve

      通过输入 yum install -y mysql-server mysql mysql-devel 命令将mysql mysql-server mysql-devel都安装好(注意:安装mysql时我们并不是安装了mysql客户端就相当于安装好了mysql数据库了,我们还需要安装mysql-server服务端才行) 通过yum方式安装mysql数据库省去了很多没必要的麻烦,当出现下面的结果时,就代表mysql数据库安装成功了

此时我们可以通过如下命令,查看刚安装好的mysql-server的版本
  #rpm -qi mysql-server

2.启动MySQL服务

   #service mysql start

 3.查看mysql运行状态

   #/etc/rc.d/init.d/mysqld status

 4.MySQL服务一些其他命令

    a、察看mysql是否在自动启动列表:  #/sbin/chkconfig list

    b、添加mysql到系统自启动服务组:  #/sbin/chkconfig – addmysql

    c、把mysql从启动服务组中删除:    #/sbin/chkconfig – delmysql  

    d、停止mysql服务:                # service mysqld stop

    e、脚本启动mysql服务:            # /etc/rc.d/init.d/mysqld start  

f、脚本停止mysql服务:            # /etc/rc.d/init.d/mysqld stop

5 mysql设置密码

命令如下:

   # /usr/bin/mysqladmin -u root password '123456'

6查看Mysql服务是否是开机启动

  命令如下:

    #chkconfig --list | grep mysqld 

7 设置开机启动

命令如下:

 # chkconfig mysqld on

8 Mysql数据库的主要配置

/etc/my.cnf 这是mysql的主配置文件

我们可以查看一下这个文件的一些信息

# cat my.cnf 

[mysqld]

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

user=mysql

# Disabling symbolic-links is recommended to prevent assorted security risks

symbolic-links=0

[mysqld_safe]

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

简要介绍

./var/lib/mysql   mysql数据库的数据库文件存放位置

./var/log mysql数据库的日志输出存放位置

 Mysql C API 函数概述

 

这里归纳了C API可使用的函数

函数

描述

mysql_affected_rows()

返回上次UPDATE、DELETE或INSERT查询更改/删除/插入的行数。

mysql_autocommit()

切换 autocommit模式,ON/OFF

mysql_change_user()

更改打开连接上的用户和数据库。

mysql_charset_name()

返回用于连接的默认字符集的名称。

mysql_close()

关闭服务器连接。

mysql_commit()

提交事务。

mysql_connect()

连接到MySQL服务器。该函数已不再被重视,使用mysql_real_connect()取代。

mysql_create_db()

创建数据库。该函数已不再被重视,使用SQL语句CREATE DATABASE取而代之。

mysql_data_seek()

在查询结果集中查找属性行编号。

mysql_debug()

用给定的字符串执行DBUG_PUSH。

mysql_drop_db()

撤销数据库。该函数已不再被重视,使用SQL语句DROP DATABASE取而代之。

mysql_dump_debug_info()

让服务器将调试信息写入日志。

mysql_eof()

确定是否读取了结果集的最后一行。该函数已不再被重视,可以使用mysql_errno()或mysql_error()取而代之。

mysql_errno()

返回上次调用的MySQL函数的错误编号。

mysql_error()

返回上次调用的MySQL函数的错误消息。

mysql_escape_string()

为了用在SQL语句中,对特殊字符进行转义处理。

mysql_fetch_field()

返回下一个表字段的类型。

mysql_fetch_field_direct()

给定字段编号,返回表字段的类型。

mysql_fetch_fields()

返回所有字段结构的数组。

mysql_fetch_lengths()

返回当前行中所有列的长度。

mysql_fetch_row()

从结果集中获取下一行

mysql_field_seek()

将列光标置于指定的列。

mysql_field_count()

返回上次执行语句的结果列的数目。

mysql_field_tell()

返回上次mysql_fetch_field()所使用字段光标的位置。

mysql_free_result()

释放结果集使用的内存。

mysql_get_client_info()

以字符串形式返回客户端版本信息。

mysql_get_client_version()

以整数形式返回客户端版本信息。

mysql_get_host_info()

返回描述连接的字符串。

mysql_get_server_version()

以整数形式返回服务器的版本号。

mysql_get_proto_info()

返回连接所使用的协议版本。

mysql_get_server_info()

返回服务器的版本号。

mysql_info()

返回关于最近所执行查询的信息。

mysql_init()

获取或初始化MYSQL结构。

mysql_insert_id()

返回上一个查询为AUTO_INCREMENT列生成的ID。

mysql_kill()

杀死给定的线程。

mysql_library_end()

最终确定MySQL C API库。

mysql_library_init()

初始化MySQL C API库。

mysql_list_dbs()

返回与简单正则表达式匹配的数据库名称。

mysql_list_fields()

返回与简单正则表达式匹配的字段名称。

mysql_list_processes()

返回当前服务器线程的列表。

mysql_list_tables()

返回与简单正则表达式匹配的表名。

mysql_more_results()

检查是否还存在其他结果。

mysql_next_result()

在多语句执行过程中返回/初始化下一个结果。

mysql_num_fields()

返回结果集中的列数。

mysql_num_rows()

返回结果集中的行数。

mysql_options()

为mysql_connect()设置连接选项。

mysql_ping()

检查与服务器的连接是否工作,如有必要重新连接。

mysql_query()

执行指定为“以Null终结的字符串”的SQL查询。

mysql_real_connect()

连接到MySQL服务器。

mysql_real_escape_string()

考虑到连接的当前字符集,为了在SQL语句中使用,对字符串中的特殊字符进行转义处理。

mysql_real_query()

执行指定为计数字符串的SQL查询。

mysql_refresh()

刷新或复位表和高速缓冲。

mysql_reload()

通知服务器再次加载授权表。

mysql_rollback()

回滚事务。

mysql_row_seek()

使用从mysql_row_tell()返回的值,查找结果集中的行偏移。

mysql_row_tell()

返回行光标位置。

mysql_select_db()

选择数据库。

mysql_server_end()

最终确定嵌入式服务器库。

mysql_server_init()

初始化嵌入式服务器库。

mysql_set_server_option()

为连接设置选项(如多语句)。

mysql_sqlstate()

返回关于上一个错误的SQLSTATE错误代码。

mysql_shutdown()

关闭数据库服务器。

mysql_stat()

以字符串形式返回服务器状态。

mysql_store_result()

检索完整的结果集至客户端。

mysql_thread_id()

返回当前线程ID。

mysql_thread_safe()

如果客户端已编译为线程安全的,返回1。

mysql_use_result()

初始化逐行的结果集检索。

mysql_warning_count()

返回上一个SQL语句的告警数。

 

API使用的一般原则

MySQL交互时,应用程序应使用该一般性原则:

1.    通过调用mysql_library_init(),初始化MySQL库。库可以是mysqlclient C客户端库,或mysqld嵌入式服务器库,具体情况取决于应用程序是否与“-libmysqlclient”或“-libmysqld”标志链接。

2.    通过调用mysql_init()初始化连接处理程序,并通过调用mysql_real_connect()连接到服务器。

3.    发出SQL语句并处理其结果。(在下面的讨论中,详细介绍了使用它的方法)。

4.    通过调用mysql_close(),关闭与MySQL服务器的连接。

5.    通过调用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(),但其名称更清楚地指明,无论应用程序使用的是mysqlclientmysqld库,启动或结束MySQL库时,应调用它们。对于早期的MySQL版本,可调用mysql_server_init()mysql_server_end()取而代之。

如果愿意,可省略对mysql_library_init()的调用,这是因为,必要时,mysql_init()会自动调用它。

要想连接到服务器,可调用mysql_init()来初始化连接处理程序,然后用该处理程序(以及其他信息,如主机名、用户名和密码)调用mysql_real_connect()。建立连接后,在低于5.0.3版的API中,mysql_real_connect()会将再连接标志(MYSQL结构的一部分)设置为1,或在较新的版本中,将其设置为0。对于该标志,值“1”指明,如果因连接丢失而无法执行语句,放弃之前,会尝试再次连接到服务器。从MySQL 5.0.13开始,可以在mysql_options()上使用MYSQL_OPT_RECONNECT选项,以控制再连接行为。完成连接后,调用mysql_close()中止它。

当连接处于活动状态时,客户端或许会使用mysql_query()mysql_real_query()向服务器发出SQL查询。两者的差别在于,mysql_query()预期的查询为指定的、由Null终结的字符串,而mysql_real_query()预期的是计数字符串。如果字符串包含二进制数据(其中可能包含Null字节),就必须使用mysql_real_query()

对于每个非SELECT查询(例如INSERTUPDATEDELETE),通过调用mysql_affected_rows(),可发现有多少行已被改变(影响)。

对于SELECT查询,能够检索作为结果集的行。注意,某些语句因其返回行,类似与SELECT。包括SHOWDESCRIBEEXPLAIN。应按照对待SELECT语句的方式处理它们。

客户端处理结果集的方式有两种。一种方式是,通过调用mysql_store_result(),一次性地检索整个结果集。该函数能从服务器获得查询返回的所有行,并将它们保存在客户端。第二种方式是针对客户端的,通过调用mysql_use_result(),对“按行”结果集检索进行初始化处理。该函数能初始化检索结果,但不能从服务器获得任何实际行。

在这两种情况下,均能通过调用mysql_fetch_row()访问行。通过mysql_store_result()mysql_fetch_row()能够访问以前从服务器获得的行。通过mysql_use_result()mysql_fetch_row()能够实际地检索来自服务器的行。通过调用mysql_fetch_lengths(),能获得关于各行中数据大小的信息。

完成结果集操作后,请调用mysql_free_result()释放结果集使用的内存。

这两种检索机制是互补的。客户端程序应选择最能满足其要求的方法。实际上,客户端最常使用的是mysql_store_result()

mysql_store_result()1个优点在于,由于将行全部提取到了客户端上,你不仅能连续访问行,还能使用mysql_data_seek()mysql_row_seek()在结果集中向前或向后移动,以更改结果集内当前行的位置。通过调用mysql_num_rows(),还能发现有多少行。另一方面,对于大的结果集,mysql_store_result()所需的内存可能会很大,你很可能遇到内存溢出状况。

mysql_use_result()1个优点在于,客户端所需的用于结果集的内存较少,原因在于,一次它仅维护一行(由于分配开销较低,mysql_use_result()能更快)。它的缺点在于,你必须快速处理每一行以避免妨碍服务器,你不能随机访问结果集中的行(只能连续访问行),你不知道结果集中有多少行,直至全部检索了它们为止。不仅如此,即使在检索过程中你判定已找到所寻找的信息,也必须检索所有的行 

通过API,客户端能够恰当地对查询作出响应(仅在必要时检索行),而无需知道查询是否是SELECT查询。可以在每次mysql_query()mysql_real_query()后,通过调用mysql_store_result()完成该操作。如果结果集调用成功,查询为SELECT,而且能够读取行。如果结果集调用失败,可调用mysql_field_count()来判断结果是否的确是所预期的。如果mysql_field_count()返回0,查询不返回数据(表明它是INSERTUPDATEDELETE等),而且不返回行。如果mysql_field_count()是非0值,查询应返回行,但没有返回行。这表明查询是失败了的SELECT。关于如何实现该操作的示例,请参见关于mysql_field_count()的介绍。

无论是mysql_store_result()还是mysql_use_result(),均允许你获取关于构成结果集的字段的信息(字段数目,它们的名称和类型等)。通过重复调用mysql_fetch_field(),可以按顺序访问行内的字段信息,或者,通过调用mysql_fetch_field_direct(),能够在行内按字段编号访问字段信息。通过调用mysql_field_seek(),可以改变当前字段的光标位置。对字段光标的设置将影响后续的mysql_fetch_field()调用。此外,你也能通过调用mysql_fetch_fields(),一次性地获得关于字段的所有信息。

为了检测和通报错误,MySQL提供了使用mysql_errno()mysql_error()函数访问错误信息的机制。它们能返回关于最近调用的函数的错误代码或错误消息,最近调用的函数可能成功也可能失败,这样,你就能判断错误是在何时出现的,以及错误是什么。

C API使用示例

连接数据库  


  1. /*练习mysql数据库的连接*/    
  2. #include    
  3. #include     
  4.     
  5. int main()    
  6. {    
  7.     MYSQL mysql;    
  8.     int t, r;    
  9.     /*连接之前,先用mysql_init初始化MYSQL连接句柄*/    
  10.     mysql_init(&mysql);    
  11.     /*使用mysql_real_connect连接服务器,其参数依次为MYSQL句柄,服务器IP地址,  
  12.     登录mysql的用户名,密码,要连接的数据库等*/    
  13.     if(!mysql_real_connect(&mysql, "localhost""root""6748355""spytest", 0, NULL, 0))     
  14.         printf("Error connecting to Mysql!\n");    
  15.     else    
  16.         printf("Connected Mysql successful!\n");    
  17.         
  18.     /*关闭连接*/    
  19.     mysql_close(&mysql);    
  20.     return 0;    
  21. }  

 数据库查询


  1. /*练习mysql数据库的查询*/    
  2. #include     
  3. #include     
  4. #include "mysql.h"    
  5.     
  6.     
  7. int main()    
  8. {    
  9.     MYSQL mysql;    
  10.     MYSQL_RES *res;    
  11.     MYSQL_ROW row;    
  12.     char *query;    
  13.     int flag, t;    
  14.     mysql_init(&mysql);    
  15.     if(!mysql_real_connect(&mysql, "localhost""root""6748355""spytest", 0, NULL, 0)) {    
  16.         printf("Failed to connect to Mysql!\n");    
  17.         return 0;    
  18.     }else {    
  19.         printf("Connected to Mysql successfully!\n");    
  20.     }    
  21.     query = "select * from log";    
  22.     /*查询,成功则返回0*/    
  23.     flag = mysql_real_query(&mysql, query, (unsigned int)strlen(query));    
  24.     if(flag) {    
  25.         printf("Query failed!\n");    
  26.         return 0;    
  27.     }else {    
  28.         printf("[%s] made...\n", query);    
  29.     }    
  30.     
  31.     
  32.     /*mysql_store_result讲全部的查询结果读取到客户端*/    
  33.     res = mysql_store_result(&mysql);    
  34.     /*mysql_fetch_row检索结果集的下一行*/    
  35.     while(row = mysql_fetch_row(res)) {    
  36.         /*mysql_num_fields返回结果集中的字段数目*/    
  37.         for(t=0; t
  38.         {    
  39.             printf("%s\t", row[t]);    
  40.         }    
  41.         printf("\n");    
  42.     }    
  43.     mysql_close(&mysql);    
  44.     return 0;    
  45. }    

 数据库插入数据

  1. /*练习mysql数据库的数据添加*/    
  2. #include     
  3. #include     
  4. #include "mysql.h"    
  5.     
  6.     
  7. int main()    
  8. {    
  9.     MYSQL mysql;    
  10.     MYSQL_RES *res;    
  11.     MYSQL_ROW row;    
  12.     char *query;    
  13.     int flag, t;    
  14.     mysql_init(&mysql);    
  15.     if(!mysql_real_connect(&mysql, "localhost""root""6748355""spytest", 0, NULL, 0)) {    
  16.         printf("Failed to connect to Mysql!\n");    
  17.         return 0;    
  18.     }else {    
  19.         printf("Connected to Mysql successfully!\n");    
  20.     }    
  21.     query = "insert into log(title, keyword, content) values('sleep', 'rest', 'I have a dream')";    
  22.     /*插入,成功则返回0*/    
  23.     flag = mysql_real_query(&mysql, query, (unsigned int)strlen(query));    
  24.     if(flag) {    
  25.         printf("Insert data failure!\n");    
  26.         return 0;    
  27.     }else {    
  28.         printf("Insert data success!\n");    
  29.     }    
  30.     
  31.     
  32.     mysql_close(&mysql);    
  33.     return 0;    
  34. }  
  35.   

数据库删除


  1. /*练习mysql数据库的删除*/    
  2. #include     
  3. #include     
  4. #include "mysql.h"    
  5.     
  6. int main()    
  7. {    
  8.     MYSQL mysql;    
  9.     MYSQL_RES *res;    
  10.     MYSQL_ROW row;    
  11.     char *query;    
  12.     int flag, t;    
  13.     mysql_init(&mysql);    
  14.     if(!mysql_real_connect(&mysql, "localhost""root""6748355""spytest", 0, NULL, 0)) {    
  15.         printf("Failed to connect to Mysql!\n");    
  16.         return 0;    
  17.     }else {    
  18.         printf("Connected to Mysql successfully!\n");    
  19.     }    
  20.     query = "delete from log where log_id=3";    
  21.     /*删除,成功则返回0*/    
  22.     flag = mysql_real_query(&mysql, query, (unsigned int)strlen(query));    
  23.     if(flag) {    
  24.         printf("Delete data failure!\n");    
  25.         return 0;    
  26.     }else {    
  27.         printf("Delete data success!\n");    
  28.     }    
  29.     
  30.     mysql_close(&mysql);    
  31.     return 0;    
  32. }    
 Linux下C程序访问mysql数据库 

  1. #include <stdio.h>
  2. #include <mysql/mysql.h>

  3. #define HOST "192.168.56.2"
  4. #define DB "webdevtest"
  5. #define USER "webdev"
  6. #define PWD "webdev"
  7. #define PORT 3306

  8. int main(){
  9.     MYSQL mysql;

  10.     //连接之前得先初始化
  11.     mysql_init(&mysql);

     //连接mysql数据库
  1.     if(!mysql_real_connect(&mysql,HOST,USER,PWD,DB,PORT,NULL,0)){
  2.         printf("连接数据库发生错误!\n");
  3.         return -1;
  4.     }
  5.     printf("连接数据库成功!\n");

  6.     //设置查询时的编码
  7.     mysql_query(&mysql,"set names utf8");

     //执行查询语句    
    char *sql="select * from test_sell_records limit 20";
  1.     if(mysql_query(&mysql,sql)!=0){
  2.         printf("执行mysql语句发生错误!\n");
  3.         mysql_close(&mysql);
  4.         return -1;
  5.     }
  6.     //获取结果集
  7.     MYSQL_RES *result=mysql_store_result(&mysql);
  8.     unsigned int i,num_fields;
  9.     //获取字段数
  10.     num_fields=mysql_num_fields(result);
  1.     //循环打印出各行
  2.     MYSQL_ROW row;
  3.     while((row=mysql_fetch_row(result))!=NULL){
  4.         for(i=0;i<num_fields;i++){
  5.             printf("%s\t",row[i]);
  6.         }
  7.         printf("\n");
  8.     }

  9.     //释放结果集
  10.     mysql_free_result(result);
  11.     //关闭连接
  12.     mysql_close(&mysql);
  13.     return 0;
  14. }
c程序访问mysql代码 
#include  
#include  
#include  
#define DB_SERVER "192.168.10.33"  
#define DB_NAME "ddource"  
#define DB_USER "oldboy"  
#define DB_PWD  "oldboy123"  
 
static MYSQL *db_handel,mysql;  
static MYSQL_ROW row;  
static int query_error;  
 
MYSQL_RES *query_test(char *sql);  
int query_show(MYSQL_RES *result);  
int main(int argc,char *argv[])  
{  
        MYSQL_RES * results;  
        results=query_test("select upper(DOC) from t_doc limit 30;");//获取记录  
        query_show(results);//显示记录  
        return 0;  
}  
 
//查询记录  
MYSQL_RES *query_test(char *sql)  
{  
        static MYSQL_RES *query_result;  
        printf("%s\n",sql);  
        mysql_init(&mysql);  
        db_handel=mysql_real_connect(&mysql,DB_SERVER,DB_USER,DB_PWD,DB_NAME,0,0,0);//打开数据库连接  
        if(db_handel==NULL)//错误处理  
        {  
                printf(mysql_error(&mysql));  
                return NULL;  
        }  
 
        query_error=mysql_query(db_handel,"set names utf8");//查询  
        query_error=mysql_query(db_handel,sql);//查询  
        if(query_error!=0)//错误处理  
        {  
                printf(mysql_error(db_handel));  
                return NULL;  
        }  
        query_result=mysql_store_result(db_handel);//获取记录  
        mysql_close(db_handel);//关闭数据库  
        return query_result;//返回记录  
}  
//显示记录  
int query_show(MYSQL_RES *result)  
{  
        unsigned int i,num_fields;  
        MYSQL_FIELD *fileds;  
        num_fields=mysql_num_fields(result);//获取字段数  
        fileds=mysql_fetch_fields(result);//获取字段数组  
        while((row=mysql_fetch_row(result))!=NULL)//循环显示  
        {  
                for(i=0;i                 {  
                    //正式操作这里通过fwrite写入到文件  
            printf("%s \t",row[i]);  
                }  
          
            printf("\n");  
    }  
        return 0;  
}  
 
2、编译  
[root@test oldboy]# gcc -o select select.c -lmysqlclient -I/usr/local/webserver/mysql/include/mysql/ -L/usr/local/webserver/mysql/lib/mysql/  
3、执行  
[root@test oldboy]# ./select   
./select: error while loading shared libraries: libmysqlclient.so.15: cannot open shared object file: No such file or directory  
[root@test oldboy]# find / -name libmysqlclient.so.15  
/usr/local/webserver/mysql/lib/mysql/libmysqlclient.so.15  
报错了...。  
 
4、问题原因:  
出现上面的错误是因为系统运行的时候没有找到程序运行所需要的libmysqlclient.so.15运行库文件,解决方法有两个:  
方法一:直接把libmysqlclient.so.15这个文件拷贝到系统指定的/usr/lib库文件目录中。  
方法二:设置/etc/ld.so.conf文件,编辑该文件,在文件中加入libmysqlclient.so.15所在目录,保存退出。需要注意的是,每次改动ld.so.conf之后需要运行ldconfig来确认刷新。  
方法三:Add /usr/local/mysql/lib/mysql to you LD_LIBRARY_PATH environment variable  
 
5、最终解决办法:  
如果出上面的提示可以通过下面的方法解决:  
[root@test oldboy]# vi /etc/ld.so.conf  
include ld.so.conf.d/*.conf  
/usr/ofed/lib  
/usr/local/webserver/mysql/lib  
/usr/local/webserver/mysql/lib/mysql  
#----------------------  
执行ldconfig 生效  
 
6、ldconfig使用方法:   
ldconfig [options] [libs]  
命令ldconfig决定位于目录/usr/lib和/lib下的共享库所需的运行的链接,这些链接在命令行上的libs指定并被保存在 /etc/ld.so.conf中。命令ldconfig和动态链接/装载工具ld.so协同工作,一起来创建和维护对最新版本共享库的链接。  
ldconfig的两个选项  
-p:仅打印出文件/etc/ld.so.cache的内容,此文件是ld.so所知道的共享库的当前列表  
-v:更新/etc/ld.so.cache的内容,列出每个库的版本号,扫描的目录和所有创建和更新的链接




阅读(1181) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~