Linux操作系统下如何操作Mysql数据库 --------实例
一. 安装Mysql数据库以及osdb驱动
- 执行以下三条语句
sudo apt-get install mysql-server
sudo apt install mysql-client
sudo apt install libmysqlclient-dev
安装的过程中会有选项,可以自己尝试翻译然后做出选择,设置密码的时候需要当心
- 用以下命令查看是否安装成功
sudo netstat -tap | grep mysql
- 如果出现下列图片则说明安装成功
- 使用下面两条命令,打开MySQL服务并且用root用户登录。
sudo service mysql start
mysql -u root -p
二.LinuxC下Mysql的常用接口函数
此段来自Linux下C语言连接MySQL
- 1.使用mysql_init初始化一个连接句柄结构
mysal_init的函数定义如下:
函数原型:
MYSQL *mysql_init(MYSQL * mysql);
参数说明:
mysql:为NULL,则分配一个(返回其指针)。或按照传入的结构指针进行初始化。
MYSQL:返回值,若为NULL表示出错。
- 2.连接数据库
目前只是分配和初始化了一个结构,仍然需要使mysql_real_connect来向一个连接提供参数。
mysql_real_connect的函数定义:
MYSQL* mysql_real_connect(MYSQL* connection,
const char *server_host,
const char *sql_user_name,
const char *sql_password,
const char *db_name,
unsigned int port_number,
const char *unix_socket_name,
unsigned int flags);
参数说明:
host:该值必须是主机名或IP地址。如果“host”是NULL或字符串"localhost",连接将被视为与本地主机的连接。
user:参数包含用户的MySQL登录ID。如果“user”是NULL或空字符串"",用户将被视为当前用户。在UNIX环境下,它是当前的登录名。
passwd:参数包含用户的密码。如果“passwd”是NULL,仅会对该用户的(拥有1个空密码字段的)用户表中的条目进行匹配检查。
db:是数据库名称。如果db为NULL,连接会将默认的数据库设为该值。
port:若不是0,其值将用作TCP/IP连接的端口号。
unix_socket:若不是NULL,该字符串描述了应使用的套接字或命名管道。
client_flag:的值通常为0。
MYSQL:如果连接成功,返回MYSQL*连接句柄。如果连接失败,返回NULL。对于成功的连接,返回值与第1个参数的值相同。
- 3.使用完数据库之后需要关闭与数据库的连接,调用mysql_close
mysql_close的函数定义:
void mysql_close(MYSQL *connection);
- 4.数据库错误信息的处理的两个函数
// 返回错误码
unsigned int mysql_errno(MYSQL *connection);
// 返回错误详细信息
char* mysql_error(MYSQL *connection);
- 4.函数mysql_options
//函数原型:
int mysql_options(MYSQL *mysql, enum mysql_option option, const char *arg);
//参数说明:
//int:返回值,该函数成功时返回0。如果使用了未知选项,返回非0值。
- 5.函数mysql_query
执行由“Null终结的字符串”查询指向的SQL查询。
正常情况下,字符串必须包含1条SQL语句,而且不应为语句添加终结分号(‘;’)或“\g”。如果允许多语句执行,字符串可包含多条由分号隔开的语句。
//函数原型:
int mysql_query(MYSQL *mysql, const char *query)
//参数说明:
//int:如果查询成功,返回0。如果出现错误,返回非0值。
- 6.函数mysql_affected_rows
返回上次UPDATE更改的行数,上次DELETE删除的行数,或上次INSERT语句插入的行数。对于UPDATE、DELETE或INSERT语句,可在mysql_query()后立刻调用。对于SELECT语句,mysql_affected_rows()的工作方式与mysql_num_rows()类似。
//函数原型:
my_ulonglong mysql_affected_rows(MYSQL *mysql)
//参数说明:
//my_ulonglong:大于0的整数表明受影响或检索的行数。“0”表示UPDATE语句未更新记录,在查询中没有与WHERE匹配的行,或未执行查询。“-1”表示查询返回错误
- 7.函数mysql_use_result
对于成功检索数据的每个查询(SELECT、SHOW、DESCRIBE、EXPLAIN),必须调用mysql_store_result()或mysql_use_result()。
mysql_use_result()将初始化结果集检索,但并不像mysql_store_result()那样将结果集实际读取到客户端。它必须通过对mysql_fetch_row()的调用,对每一行分别进行检索。这将直接从服务器读取结果,而不会将其保存在临时表或本地缓冲区内,与mysql_store_result()相比,速度更快而且使用的内存也更少。客户端仅为当前行和通信缓冲区分配内存,分配的内存可增加到max_allowed_packet字节。
使用mysql_use_result()时,必须执行mysql_fetch_row(),直至返回NULL值,否则,未获取的行将作为下一个检索的一部分返回。
//函数原型:
MYSQL_RES *mysql_use_result(MYSQL *mysql)
- 8.函数mysql_store_result
mysql_store_result()将查询的全部结果读取到客户端,分配1个MYSQL_RES结构,并将结果置于该结构中。
如果查询未返回结果集,mysql_store_result()将返回Null指针(例如,如果查询是INSERT语句)。
如果读取结果集失败,mysql_store_result()还会返回Null指针。通过检查mysql_error()是否返回非空字符串,mysql_errno()是否返回非0值,或mysql_field_count()是否返回0,可以检查是否出现了错误。
如果未返回行,将返回空的结果集。(空结果集设置不同于作为返回值的空指针)。
一旦调用了mysql_store_result()并获得了不是Null指针的结果,可调用mysql_num_rows()来找出结果集中的行数。
可以调用mysql_fetch_row()来获取结果集中的行,或调用mysql_row_seek()和mysql_row_tell()来获取或设置结果集中的当前行位置。
一旦完成了对结果集的操作,必须调用mysql_free_result()。
//函数原型:
MYSQL_RES *mysql_store_result(MYSQL *mysql)
- 9.函数mysql_fetch_row
检索结果集的下一行。在mysql_store_result()之后使用时,如果没有要检索的行,mysql_fetch_row()返回NULL。在mysql_use_result()之后使用时,如果没有要检索的行或出现了错误,mysql_fetch_row()返回NULL。
//函数原型:
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
- 9.函数mysql_free_result
//函数原型:
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
三. 操作实例
- 连接数据库并返回一个句柄
//连接数据库并且返回数据库的句柄
MYSQL database_connect(){
MYSQL mysql; /*初始化一个mysql句柄,用来操作数据库*/
mysql_init(&mysql);
if (!mysql_real_connect(&mysql, "127.0.0.1", "root", "123456", "client_server", 0, NULL, 0)){ /*通过句柄进行对数据库连接,localhost表示本机【如果网络则为ip地址】*/
printf("Error connecting to database:%s\n", mysql_error(&mysql)); /*root为数据库的用户, 123456为密码, test为你要连接的数据库*/
}else{
printf("数据库连接成功!\n");
printf("等待连接......\n");
}
return mysql; /*返回数据库的句柄*/
}
- 向数据库中插入数据
int database_insert_data_to_clientinfo(MYSQL mysql, Cinfo client){
int res; /*查询返回值*/
char buf[1024] = {0};
sprintf(buf, "insert into client_info(id,password,address,real_name,phone,sex,product,s_id) values ('%s','%s','%s','%s','%s','%s','%s','%s');",
client.id, client.password, client.address, client.real_name, client.phone, client.sex, client.product, client.s_id); /*将客户的信息通过字符串拼接形成一条数据库插入数据的指令*/
res = mysql_query(&mysql, buf); /*执行数据库操作语句*/
if (!res){
printf("insert %lu rows\n", (unsigned long)mysql_affected_rows(&mysql)); /*执行语句的具体情况*/
}else{
fprintf(stderr, "insert error %d:%s\n", mysql_errno(&mysql), mysql_error(&mysql)); /*打印错误信息*/
return FAILED;
}
//mysql_free_result(res);
return SUCCESS;
}
- 查询数据库中的数据并且返回给结构体数组
nt database_search_server_info(MYSQL mysql, Sinfo *server, int *returnCount){
char *query_server_info = "select * from server_info;"; /*定义一个存放数据库操作指令的字符串*/
MYSQL_RES *res; /*res用来保存查询到的结果集*/
MYSQL_ROW row; /*用来储存每一行的数据*/
int count = 0;
if (mysql_query(&mysql, query_server_info)){ /*调用数据库的查询语句函数,成功返回0,失败返回其他*/
printf("Failed to query server_info!\n");
mysql_free_result(res);
return FAILED;
}else{
//printf("Query made ........\n");
res = mysql_use_result(&mysql); /*初始化逐行的结果集检索*/
if (res){
for (int r = 0; r < mysql_field_count(&mysql); r++){/*返回上次执行语句的的结果列的数目*/
row = mysql_fetch_row(res); /*从结果集中获取下一行*/
if (row == NULL){ /*若下一行为空,则跳出循环*/
break;
}
count++; /*记录查询到的客户数量*/
for (int t = 0; t < mysql_num_fields(res);t++){ /*返回结果集中的列数*/
if (t == 0){
strcpy(server[r].id, row[t]); /*第一列为客服的id,赋值给结构体中的id*/
}else if (t == 1){
strcpy(server[r].password, row[t]); /*第二列为客服的password,赋值给结构体中的password*/
}else if (t == 2){
strcpy(server[r].address, row[t]); /*第三列为客服的address,赋值给结构体中的address*/
}else if (t == 3){
strcpy(server[r].real_name, row[t]); /*第四列为客服的real_name,赋值给结构体中的real_name*/
}
else if (t == 4){
strcpy(server[r].phone, row[t]); /*第五列为客服的phone,赋值给结构体中的phone*/
}
else if (t == 5){
strcpy(server[r].sex, row[t]); /*第六列为客服的sex,赋值给结构体中的sex*/
}
else if (t == 6){
server[r].client_num = atoi(row[t]); /*第七列为客服所对接的客户数量,赋值给结构体中的client_number*/
}
//printf("%s ", row[t]);
}
//printf("\n");
}
}
mysql_free_result(res);
}
*returnCount = count; /*释放结果集*/
return SUCCESS;
}
- 关闭与数据库的连接
void database_close_connection(MYSQL mysql){ /*断开与数据库的连接*/
mysql_close(&mysql);
}