前段时间略微学习了下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