【Unix环境编程】Linux mysql编程

前段时间略微学习了下linux下mysql数据库的使用。

1.linux下mysql安装。

参见网址http://www.javaeye.com/topic/564762,mysql 的三种安装方式: RPM  二进制包和源代码。mysql也是一个服务器,需要运行。

 

2.linux下mysql命令运用。

在ssh中远程登录服务器:mysql -h 192.168.1.112 -u username -p password,当然如果服务器的mysql需要设置权限。

mysql> show databases

显示系统中所有数据库。

mysql> use dbname

USE db_name语句告诉mysql使用db_name数据库作为随后的查询的缺省数据库。

进去数据库之后就可以进行相应的数据库操作,create database,create tabel,alter/drop table,delete、select、join、insert、replace等语句。

一些语句:

mysql> create table t_zz (id1 int not null,money double not null,id2 int null,id3 int null, primary key (id1,id2,id3));

  mysql> show columns from  t_ad;

mysql> show columns from  t_ad; 

+-------------+-----------+------+-----+---------+-------+

| Field       | Type      | Null | Key | Default | Extra |

+-------------+-----------+------+-----+---------+-------+

| id       | int(11)   | NO   | PRI |         |       |

| name      | char(100) | YES  |     | NULL    |       |

| type      | char(1)   | NO   |     |         |       |

.....

+-------------+-----------+------+-----+---------+-------+

12 rows in set (0.00 sec)


mysql> alter table t_usertob add yestodaynum double not null;

mysql> create cluster index on t_usertob(dealtime DESC);

mysql> insert into t_tmp values('15','比','1',NULL,122,122,NULL,NULL,4263,2222222,'随便',10);

 

3.linux c——mysql编程

我们可以手动建立数据库,建表或者插入语句,大多数其他客户 API都使用mysqlclient库与mysql服务器通信。客户有一个最大通讯缓冲区大小。初始分配的缓冲区大小(16K字节) 自动地增加到最大尺寸(缺省的最大值是24M)。因为缓冲区大小只是按保证需求而被增加,简单地增加缺省的最大限制并不造成更多被消耗。该尺寸检查主要是一个对错误的查询和通讯包的检查。通讯缓冲区必须足够大以便一个单独的SQL语句(对客户-服务器传输)和一行返回的数据(对服务器-客户传输)。每个线程的通讯缓冲区被动态扩大到最大限制来处理任何查询或行。例如,如果你包含大到16M数据的BLOB值,你必须有一个至少16M通讯缓冲区限制(在服务器和客户两端)。客户的缺省最大值是24M,但是在服务器端的缺省最大值是1M。你可以在服务器启动时通过改变max_allowed_packet参数的值来改变它。mysql服务器在每个查询后缩小每个通讯缓冲区到net_buffer_length个字节。对客户,与一个连接相关的缓冲区的大小没被减少,直到连接被关闭,在此时客户内存被回收。
 

如果你用线程的编程,你应该用--with-thread-safe-client编译mysql C API,这将使C API线程对每个连接更安全。你可以让2个线程共享相同的连接,只要如果你做下列事情:

            两个线程不能同时在同一个连接上发送查询到mysql。特别是你必须保证在一个mysql_query()mysql_store_result()之间没有其他线程正在使用同一个连接。 许多线程能存取用mysql_store_result()检索出来的不同结果集合。如果你使用mysql_use_result,你必须保证没有其他线程在同一个连接上正在询问任何东西,直到结果集合被关闭。

 

笔者做的是一个网络服务器程序,单独开辟一个线程处理client发送的存取数据操作。现单独抽取数据库部分代码

#include <mysql.h>

 

void pthread_DB()

{

 MYSQL mysql;       //这个结构表示对一个数据库连接的句柄,它被用于几乎所有的MySQL函数

 MYSQL_RES *res=NULL;   //这个结构代表返回行的一个查询的(SELECT, SHOW, DESCRIBE, EXPLAIN)的结果。

 MYSQL_ROW row; //这是一个行数据的类型安全(type-safe)的表示。当前它实现为一个计数字节的字符串数组。行通过调用

                  //mysql_fetch_row()获得
 char  x_sql[1000]="/0";
 
 //读取数据库 信息保存 先定义两组组数据 后期可以考虑一次读取所有情况记录
 int   Id[2];
 char  Name[2][100];
 char  Default[2][108];

//初始化数据库 MYSQL_CONNECT包括mysql服务器ip username pwd dbname

mysql_init(&mysql);

//分配或初始化适合mysql_real_connect()的一个MYSQL对象。如果mysql是一个NULL指针,函数分配、初始化并且返回一个新对象。否则对象被初始化并且返回对象的地址。如果mysql_init()分配一个新对象,它将在调用mysql_close()关闭连接时被释放。


 if (!mysql_real_connect(&mysql,MYSQL_CONNECT,0,NULL,0))
 {
  printf("Error connecting to database: %s/n",mysql_error(&mysql));

 }

//mysql_real_connect()试图建立到运行host的一个MySQL数据库引擎的一个连接。

//对于由mysql指定的连接,mysql_errno()返回最近调用的可能成功或失败的API函数的错误代码。

 

sprintf(x_sql,"select * from t_ad");     //where id = %d",id 根据id读取数据库 当然这里最好不用* 比较浪费资源

printf("x_sql=%s /t/n",x_sql);

if((ret = mysql_query(&mysql,x_sql)))
{

        //mysql_query执行指向空终止的字符串query的SQL查询,查询必须由一个单个的SQL语句组成。
        printf("query error:%s!/n",mysql_error(&mysql));
        exit(0);
}
else
{
        printf("f2 %s/n",name);
        res = mysql_store_result(&mysql);

        //mysql_store_result()读取一个到客户的查询的全部结果,分配一个MYSQL_RES结构,并且把结果放进这个结构中
        

 

        //检索一个结果集合的下一行。当在mysql_store_result()之后使用时,如果没有更多的行可见所时,mysql_fetch_row()返回NULL。当在mysql_use_result()之后使用时,当没有更多的行可检索时或如果出现一个错误,mysql_fetch_row()返回NULL。

在行中值的数量由mysql_num_fields(result)给出。如果row保存了从一个对用mysql_fetch_row()调用返回的值,指向该值的指针作为row[0]row[mysql_num_fields(result)-1]来存取。在行中的NULL值由NULL指针指出。

在行中字段值的长度可以通过调用mysql_fetch_lengths()获得。空字段和包含NULL的字段长度都是 0;你可以通过检查该值的指针区分他们。如果指针是NULL,字段是NULL;否则字段是空的
        while((row = mysql_fetch_row(res)))
        { 

           Id[tmpCount] = atoi(row[0]);
           sprintf(Name[tmpCount],"%s",row[1]);
           Type[tmpCount] = atoi(row[2]);
                
           #ifdef DEBUG

             printf("读取数据一条记录后:/n");
             printf("id = %d /n",Id[tmpCount]);
             printf("Type = %d /n",Type[tmpCount]);
             printf("Name = %s /n",Name[tmpCount]);
             fflush(stdout);
           #endif

        }
        mysql_free_result(res); 

        //释放由mysql_store_result()mysql_use_result()、mysql_list_dbs()等为一个结果集合分配的内存。当你用完了一个结果集合时,你必须调用mysql_free_result()来释放它使用的内存
 }


 mysql_close(&mysql);

 //关闭一个以前打开了的连接。如果句柄由mysql_init()mysql_connect()自动分配,mysql_close()也释放被mysql指向的连接句柄。

 

 }

 

在编译的时候需要链接mysql库 -L/usr/lib/mysql/ -lmysqlclient

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值