centos7 下通过yum 安装 mysql 点击这里参考
mysql API 参考:
1.初始化mysql句柄
MYSQL *mysql init( MYSQL *mysql );
通常参数为NULL,表示要动态分配一块空间进行初始化
2.连接mysql服务器
MYSQL *mysql_real_connect(MYSQL *mysql, const char *host,
const char *user, const char *passwd, const char *db,
unsigned int port, const char *unix_socket, unsigned long client_flag)
返回值: 返回句柄的空间首地址; 出错返回 NULL
mysql:初始化完成的句柄;
host: 要连接的mysql服务器IP;
user: mysql数据库用户名;
passwd:数据库访问密码
db:默认要选择使用的数据库名称;
port: mysql服务端口,0默认表示3306端口;
unix_socket:指定socket或管道,通常为NULL
client_flag:一些选项操作标志位,通常置0;
3.设置客户端字符编码集
int mysql_set_character_set(MYSQL *mysql, const char *csname)
返回值: 成功返回0, 失败返回非0
mysql: mysql句柄;
csname:字符编码集名称,通常置为utf8
例子:
MYSQL mysql; // 定义句柄类型变量
mysql_init(&mysql); // 进行初始化
if (!mysql_real_connect(&mysql, "host","user"," passwd"," database",0,NULL,0))
{
fprintf(stderr, "Failed to connect to database: Error: %s\n",
mysql_error(&mysql));
}
if (!mysql_set_character_set(&mysql, "utf8"))
{
printf("New client character set: %s\n",
mysql_character_set_name(&mysql));
}
4.选择使用的数据库
int mysql_select_db(MYSQL *mysql, const char* db)
返回值: 成功返回0, 失败返回非0
mysql: 句柄;
db: 数据库名称
5.表以及其中数据的各项操作(执行语句)
int mysql_query(MYSQL *mysql, const char *stmt_str)
返回值:成功返回0;失败返回非0
mysql:操作句柄;
stmt_str:要执行的sql语句
插入以及修改以及删除三个操作,只要语句执行成功,操作就完成,
但是查询不一样,语句执行成功后,需要获取结果
6.从远程服务器获取结果集()
MYSQL_RES *mysql_store_result(MYSQL *mysql) ---将查询结果获取到本地
返回值: 成功返回句柄, 失败返回null
mysql: mysql句柄
uint64_t mysql_num_rows(MYSQL_RES *result) ---获取结果集中结果的条数
unsigned int mysql_num_fields(MYSQL_RES *result) ---获取结果集中结果的列数
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result) ---遍历结果集,每次获取一条/行数据
(不会重复, 内部有读取位置维护)
MYSQL_ROW 是一个 char** 二级指针, MYSQL_ROW row; row[0]表示第0列数据,
(注意: 结果集中的结果都是字符串(与数据原类型无关))
void mysql_free_result(MYSQL RES *result) ---释放 结果集 空间
(不释放就会造成资源泄露)
7.关闭数据库释放资源
void mysql_close(MYSQL *mysql);
8.获取mysql接口调用失败原因
char *mysql_error(MYSQL *mysql);
流程: 12个接口
初始化: mysq_init;
连接服务器: mysql_real_connect;
设置字符集:mysql_set_character_set;
选择数据库: mysql_select_db
执行语句: mysql_query;
保存结果集: mysql_store_result;
获取结果行数: mysql_num_rows;
获取结果列数:mysql_num_fields
遍历结果: mysql_fetch_row;
释放结果集: mysql_free_result;
关闭数据库: mysql_close;
获取接口错误原因: mysql_error
编写简单C代码使用 mysql数据库
注意 : 编译时需要链接库
#include<stdio.h>
#include<unistd.h>
#include<string.h>
#include<mysql/mysql.h>
int main(){
MYSQL *mysql = mysql_init(NULL);
if(mysql == NULL){
printf("init mysql error\n");
return -1;
}
// 连接服务器
if(mysql_real_connect(mysql, "172.16.141.156","root","","db_blog",0,NULL,0) == NULL){
printf("connect mysql server failed:%s\n", mysql_error(mysql));
return -1;
}
// 设置客户端字符集
if(mysql_set_character_set(mysql, "utf8") != 0){
printf("set character failed:%s\n", mysql_error(mysql));
return -1;
}
// 选择切换使用的数据库
if(mysql_select_db(mysql, "db_blog") != 0){
printf("select db failed: %s\n", mysql_error(mysql));
return -1;
}
// 创建表
// 多个语句进行实验
// //char* sql_str = "create table if not exists tb_stu(id int,name varchar(32), info text, score decimal(4,2), birth datetime);";
char *sql_str = "insert tb_stu values(1,'张三','真的好帅',99.456,'2002-02-28 12:00:00');";
//char *sql_str = "update tb_stu set name='李四',info='没有头发是个大佬' where name='张三' ;";
//char *sql_str = "delete from tb_stu where name= '张三';";
int ret = mysql_query(mysql, sql_str);
if(ret != 0){
printf("query sql failed: %s\n", mysql_error(mysql));
return -1;
}
char *sql = "select * from tb_stu;";
int ret1 = mysql_query(mysql, sql);
if(ret1 != 0){
printf("query sql failed: %s\n", mysql_error(mysql));
return -1;
}
MYSQL_RES *res = mysql_store_result(mysql);
if(res == NULL){
printf("store result failed: %s\n", mysql_error(mysql));
return -1;
}
int num_row = mysql_num_rows(res); // 行数
int num_col = mysql_num_fields(res); // 列数
int i = 0;
for(int i = 0; i < num_row; ++i){
// res中 有读取位置控制, 每次获取的都是下一条数据
MYSQL_ROW row = mysql_fetch_row(res);
for(int j = 0; j < num_col; ++j){
printf("%s\t", row[j]);
}
printf("\n");
}
mysql_free_result(res);// 获取了结果集,使用完毕, 需要释放, 否则会造成内存泄漏
mysql_close(mysql);
return 0;
}
gcc test.c -o test -lmysqlclient 依然报错, 因为 库文件 在 usr/lib64/mysql 路径下, 没有直接在 lib64目录下, 所以需要指定 库文件路径:
gcc test.c -o test -L/usr/lib64/mysql -lmysqlclient