使用C语言连接
MysqL操作是线程安全的(事务)
以API路线认识MysqL API的使用.
库的安装
如果是通过yum等安装方式安装的MysqL,则在安装过程MysqL开发包一般也安装好了,因此推荐这种方式安装MysqL;
安装好后开发头文件目录位于/usr/include/MysqL
,库位于/usr/lib64/MysqL
如果没有找到,说明可能没有安装,可以手动命令安装:
yum install -y MysqL-community-devel ## 开发包
也可以单独下载MysqL连接工具,MySQL :: Download MySQL Connector/C++ (Archived Versions);注意,如果能找到对应的版本是最好,不过现在旧版本官网可能不显示了,这个也无妨,MysqL对新版本是能做到前后兼容的,因此可以下载推荐的8.x版本.这种方法缺点就是比较繁琐,还可能出现兼容性问题等,因此不是很推荐.
对下载下来的包中,目前最重要的是include文件夹与lib文件夹,有这两个目录就能C/C++连接数据库与开发.(需要动静态库系列知识)
linux generic: 通用版
C API
MysqL_init
MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.54 mysql_real_connect()
MysqL* MysqL_init(MysqL *MysqL);
顾名思义,对
MysqL*
对象进行初始化.
MysqL_real_connect
MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.54 mysql_real_connect()
MysqL *MysqL_real_connect(
MysqL *MysqL, // 输出型参数:成功则返回MysqL访问句柄,错误返回NULL;
const char *host, // MysqLd的ip
const char *user, // 登录的用户名
const char *passwd, // 登录密码
const char *db, // 连接的数据库
unsigned int port, // MysqLd端口号
const char *unix_socket, // 域间套接字(类似进程间管道通信)
unsigned long clientflag); // 位图,启用一些特性;一般使用默认就好,即0
注意:
返回值
如果连接成功,则使用MysqL*连接处理程序,如果连接不成功,则为NULL。对于成功的连接,返回值与第一个参数的值相同。
MysqL_close
MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.5 mysql_close()
void MysqL_close(MysqL *MysqL);
MysqL_query
MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.53 mysql_query()
int MysqL_query(
MysqL *MysqL,
const char *stmt_str);
注意:
返回值:
成功返回0,失败返回错误码
#include<iostream>
#include<MysqL/MysqL.h>
#include<string>
#include<cassert>
#include<chrono>
#include<thread>
/*
MysqL *MysqL_real_connect(
MysqL *MysqL, // 输出型参数:成功则返回MysqL访问句柄,错误返回NULL
const char *host, // MysqLd的ip
const char *user, // 登录的用户名
const char *passwd, // 登录密码
const char *db, // 连接的数据库
unsigned int port, // MysqLd端口号
const char *unix_socket, // 域间套接字(类似进程间管道通信)
unsigned long clientflag); // 位图,启用一些特性;一般使用默认就好,即0
*/
const std::string host = "127.0.0.1";
const std::string user = "chj";
const std::string passwd = "123456";
const std::string db = "test_db";
const unsigned int port = 3306;
//const std::string socket = ;
const unsigned long clientflag = 0;
int main(){
std::cout<<"MysqL client version :" << MysqL_get_client_info()<<std::endl;
MysqL* MysqL = MysqL_init(nullptr);
if(MysqL == nullptr){
std::cerr<<" MysqL init error "<<std::endl;
return 1;
}
if(MysqL_real_connect(MysqL,host.c_str(),user.c_str(),passwd.c_str(),db.c_str(),port,nullptr,clientflag)){
std::cout<<"conect success" <<std::endl;
}
else{
std::cerr<<"MysqL connect error"<<std::endl;
return 2;
}
std::string sql;
while(true){
std::cout<<"MysqL >>> ";
if(!std::getline(std::cin,sql)) break;
if(sql == "quit" || sql == "exit") break;
int n = MysqL_query(MysqL,sql.c_str());
if(n == 0){
std::cout<<sql<<" sucess"<<std::endl;
}
else{
std::cerr<<sql<<" Failed, "<<n<<std::endl;
}
}
MysqL_close(MysqL);
return 0;
}
MysqL_set_character_set
MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.69 mysql_set_character_set()
int MysqL_set_character_set(
MysqL *MysqL,
const char *csname); //cs == character set
问题: 一般来说,MysqLd也是设置成utf8的,C/C++代码也是utf8的,为什么中文可能会出现乱码呢?
解析: 两端都没问题,那问题只能出自于链接,因此需要设置链接字符集
建立好链接之后,获取英文没有问题,如果获取中文是乱码:
设置链接的默认字符集是utf8,原始默认是latin1
MysqL_set_character_set(myfd, "utf8");
MysqL_store_result
MySQL :: MySQL 5.7 C API Developer Guide :: 5.4.77 mysql_store_result()
MysqL_RES *MysqL_store_result(MysqL *MysqL);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。