MySQL C連接與使用

来源:https://www.cnblogs.com/DSCL-ing/p/18425440
-Advertisement-
Play Games

目錄使用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官方C介面聲明

MySQL C 結構體

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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • liwen01 2024.09.16 前言 802.11 無線 WiFi 網有三類幀:數據幀、管理幀、控制幀。與有線網相比,無線 WiFi 網會複雜很多。大部分應用軟體開發對 WiFi 的控制幀和管理幀瞭解得並不多,因為它們在物理層和數據鏈路層就已經被處理了,上層應用很少能感知到。 一般是在設備出現 ...
  • 寫在前面 本隨筆是非常菜的菜雞寫的。如有問題請及時提出。 可以聯繫:[email protected] GitHhub:https://github.com/WindDevil (目前啥也沒有 引言 兜兜轉轉又是新的一章的開始,還是首先要看官方手冊里的理論介紹和內容. 這裡主要還是提綱挈領地摘抄裡面 ...
  • 金葫蘆STM32L431上手流程教材書名和開發板教材:《嵌入式技術基礎與實踐(第6版)》(王宜懷主編)開發板:AHL-STM32L431金葫蘆STM32L431上手流程1、需要用到的軟體和電子資源 AHL-GEC-IDE(4.55)————>AHL-GEC-IDE (suda.edu.cn)AHL- ...
  • 筆者出於學習(折騰)原因想要改換 Linux 發行版,於是將目光投向大名鼎鼎的 ArchLinux。 ArchLinux 的安裝過程漫長且複雜,遂彙總成小記,以備日後參考。 小記中筆者共使用兩塊硬碟,一塊已含有 Windows10 分區,另一塊作為雙系統數據共用盤。 LiveCD 本小記略過燒錄鏡像 ...
  • 出乎意料的現象 我們有一張測試表 t1,表中有一些數據,當 session1 開啟一個事務,並執行了 select for update 操作後仍未提交事務,在併發事務(如 session2)開啟事務並行執行一些操作會有不同的鎖現象,表現在: select for update 會出現鎖等待 del ...
  • Linux平臺安裝Oracle 19c的時候遇到了下麵錯誤“[INS-35180] Unable to check for available memory”,如圖所示: 具體的錯誤信息如下所示: Additional Information:Exception details - PRVG-190 ...
  • SQL Server的Descending Indexes降序索引 背景索引是關係型資料庫中優化查詢性能的重要手段之一。對於需要處理大量數據的場景,合理的索引策略能夠顯著減少查詢時間。 特別是在涉及多欄位排序的複雜查詢中,選擇合適的索引類型(如降序索引)顯得尤為重要。本文將探討如何在SQL Serv ...
  • 背景 最近碰到一個 case,一個 Redis 實例的記憶體突增,used_memory最大時達到了 78.9G,而該實例的maxmemory配置卻只有 16G,最終導致實例中的數據被大量驅逐。 以下是問題發生時INFO MEMORY的部分輸出內容。 # Memoryused_memory:84716 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...