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