目錄使用C語言連接庫的安裝C APImysql_initmysql_real_connectmysql_closemysql_querymysql_set_character_setmysql_store_result 使用C語言連接 mysql操作是線程安全的(事務) 以API路線認識mysql ...
目錄
使用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_init初始化
MYSQL*
對象.
返回值
如果連接成功,則使用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);
註意:
官方文檔中描述說到,不用在sql語句後面加上';'和'\G'
返回值:
成功返回0,失敗返回錯誤碼
模擬實現一個簡單的MySQL客戶端:
#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);
本文來自博客園,作者:HJfjfK,原文鏈接:https://www.cnblogs.com/DSCL-ing/p/18425440