【MySQL】C語言連接

要使用C語言連接mysql,需要使用mysql官網提供的庫,大家可以去官網下載

我們使用C接口庫來進行連接

要正確使用,我們需要做一些準備工作:

  • 保證mysql服務有效
  • 在官網上下載合適自己平臺的mysql connect庫,以備后用

下載開發庫

sudo apt-get install libmysqlclient-dev

驗證安裝

ll /usr/include/mysql/

在這里插入圖片描述

嘗試鏈接mysql client

通過mysql_get_client_info() 函數,來驗證我們的引入是否成功

#include <mysql/mysql.h>  
#include <stdio.h>  int main() {  // 調用 mysql_get_client_info 函數獲取客戶端庫版本信息  const char *client_info = mysql_get_client_info();  // 打印客戶端庫版本信息  if (client_info) {  printf("MySQL client library version: %s\n", client_info);  } else {  printf("Failed to get MySQL client library version.\n");  }  // 注意:雖然這個示例沒有實際連接到數據庫,但調用 mysql_get_client_info 不需要連接  // 如果你需要進行數據庫操作,需要初始化 MySQL 庫并連接數據庫,這超出了這個簡單示例的范圍  return 0;  
}
$ gcc -o test test.c -I./include -L./lib -lmysqlclient
$ ls
$./test
./test: error while loading shared libraries: libmysqlclient.so.18: cannot open shared object file: No such file or directory
$ export LD_LIBRARY_PATH=./lib
$./test
mysql client version: 6.1.6

至此引入庫的工作已經做完,接下來就是熟悉接口

mysql接口介紹

  • 初始化mysql_init()
    要使用庫,必須先進行初始化!
MYSQL *mysql_init(MYSQL *mysql);: MYSQL *mfp = mysql_init(NULL)
  • 鏈接數據庫mysql_real_connect
    初始化完畢之后,必須先鏈接數據庫,在進行后續操作。(mysql網絡部分是基于TCP/IP的)
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 clientflag);
//建立好鏈接之后,獲取英文沒有問題,如果獲取中文是亂碼:
//設置鏈接的默認字符集是utf8,原始默認是latin1
mysql_set_character_set(mfd, "utf8");

第一個參數MYSQL是C api中一個非常重要的變量(mysql_init的返回值),里面內存非常豐富,有port,dbname,charset等連接基本參數。它也包含了一個叫st_mysql_methods的結構體變量,該變量里面保存著很多函數指針,這些函數指針將會在數據庫連接成功以后的各種數據操作中被調用。mysql_real_connect函數中各參數,基本都是顧名思義。

  • 下發mysql命令mysql_query
int mysql_query(MYSQL *mysql, const char *q);

第一個參數上面已經介紹過,第二個參數為要執行的sql語句,如"select * from table"。

  • 獲取執行結果mysql_store_result
    sql執行完以后,如果是查詢語句,我們當然還要讀取數據,如果update,insert等語句,那么就看下操作成功與否即可。我們來看看如何獲取查詢結果:如果mysql_query返回成功,那么我們就通過mysql_store_result這個函數來讀取結果。原型如下:
MYSQL_RES *mysql_store_result(MYSQL *mysql);

該函數會調用MYSQL變量中的st_mysql_methods中的read_rows函數指針來獲取查詢的結果。同時該函數會返回MYSQL_RES這樣一個變量,該變量主要用于保存查詢的結果。同時該函數malloc了一片內存空間來存儲查詢出來的數據,所以我們一定要記得free(result),不然肯定會造成內存泄漏的。
執行完mysql_store_result以后,其實數據都已經在MYSQL_RES變量中了,下面的api基本就是讀取MYSQL_RES中的數據。

  • 獲取結果行數mysql_num_rows
my_ulonglong mysql_num_rows(MYSQL_RES *res);
  • 獲取結果列數mysql_num_fields
unsigned int mysql_num_fields(MYSQL_RES *res);
  • 獲取列名mysql_fetch_fields
MYSQL_FIELD *mysql_fetch_fields(MYSQL_RES *res);
int fields = mysql_num_fields(res);
MYSQL_FIELD *field = mysql_fetch_fields(res);
for(int i = 0; i < fields; i++){cout<<field[i].name<<" ";
}
cout<<endl;
  • 獲取結果內容mysql_fetch_row
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result);

它會返回一個MYSQL_ROW變量,MYSQL_ROW其實就是char **,就當成一個二維數組來用吧。

MYSQL_ROW line;
for(int i = 0; i < nums; i++){line = mysql_fetch_row(res);for(int j = 0; j < fields; j++){cout<<line[j]<<" ";}cout<<endl;
}
  • 關閉mysql鏈接mysql_close
void mysql_close(MYSQL *sock);

另外,mysql C api還支持事務等常用操作,大家下來自行了解:

my_bool STDCALL mysql_autocommit(MYSQL * mysql, my_bool auto_mode);
my_bool STDCALL mysql_commit(MYSQL * mysql);
my_bool STDCALL mysql_rollback(MYSQL * mysql);

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/82941.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/82941.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/82941.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NFS 掛載配置與優化最佳實踐指南

文章目錄 NFS 掛載配置與優化最佳實踐指南1. 服務器端配置1.1 安裝 NFS 服務1.2 配置共享目錄常用配置選項說明 1.3 啟動與檢查服務 2. 客戶端掛載2.1 安裝 NFS 客戶端2.2 掛載 NFS 共享2.3 自動掛載 3. 客戶端掛載選項4. 性能優化與故障排查4.1 性能優化建議4.2 常見問題排查 …

3D PDF如何制作?SOLIDWORKS MBD模板定制技巧

SOLIDWORKS制作3D PDF模版 SOLIDWORKS MBD能夠幫助工程師以清晰直觀的方式描述產品尺寸信息。在3D PDF文件中&#xff0c;用戶可以自由旋轉和移動視圖&#xff0c;方便查看模型的各個尺寸細節。 本文將帶您一步步學習如何使用SOLIDWORKS MBD制作專業的3D PDF模板&#xff0c;…

Unity-QFramework框架學習-MVC、Command、Event、Utility、System、BindableProperty

QFramework QFramework簡介 QFramework是一套漸進式、快速開發框架&#xff0c;適用于任何類型的游戲及應用項目&#xff0c;它包含一套開發架構和大量的工具集 QFramework的特性 簡潔性&#xff1a;QFramework 強調代碼的簡潔性和易用性&#xff0c;讓開發者能夠快速上手&a…

R3GAN訓練自己的數據集

簡介 簡介&#xff1a;這篇論文挑戰了"GANs難以訓練"的廣泛觀點&#xff0c;通過提出一個更穩定的損失函數和現代化的網絡架構&#xff0c;構建了一個簡潔而高效的GAN基線模型R3GAN。作者證明了通過合適的理論基礎和架構設計&#xff0c;GANs可以穩定訓練并達到優異…

【PhysUnits】15.1 引入P1后的加一特質(add1.rs)

一、源碼 代碼實現了類型系統中的"加一"操作&#xff08;Add1 trait&#xff09;&#xff0c;用于在編譯期進行數字的增量計算。 //! 加一操作特質實現 / Increment operation trait implementation //! //! 說明&#xff1a; //! 1. Z0、P1,、N1 1&#xff0…

記錄算法筆記(2025.5.29)最小棧

設計一個支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常數時間內檢索到最小元素的棧。 實現 MinStack 類: MinStack() 初始化堆棧對象。void push(int val) 將元素val推入堆棧。void pop() 刪除堆棧頂部的元素。int top() 獲取堆棧頂部的元素。int get…

Android高級開發第一篇 - JNI(初級入門篇)

文章目錄 Android高級開發JNI開發第一篇&#xff08;初級入門篇&#xff09;&#x1f9e0; 一、什么是 JNI&#xff1f;? 為什么要用 JNI&#xff1f; ?? 二、開發環境準備開發工具 &#x1f680; 三、創建一個支持 JNI 的 Android 項目第一步&#xff1a;創建新項目項目結構…

PyTorch Image Models (timm) 技術指南

timm PyTorch Image Models (timm) 技術指南功能概述 一、引言二、timm 庫概述三、安裝 timm 庫四、模型加載與推理示例4.1 通用推理流程4.2 具體模型示例4.2.1 ResNeXt50-32x4d4.2.2 EfficientNet-V2 Small 模型4.2.3 DeiT-3 large 模型4.2.4 RepViT-M2 模型4.2.5 ResNet-RS-1…

openEuler安裝MySql8(tar包模式)

操作系統版本&#xff1a; openEuler release 22.03 (LTS-SP4) MySql版本&#xff1a; 下載地址&#xff1a; https://dev.mysql.com/downloads/mysql/ 準備安裝&#xff1a; 關閉防火墻&#xff1a; 停止防火墻 #systemctl stop firewalld.service 關閉防火墻 #systemc…

從零開始的數據結構教程(六) 貪心算法

&#x1f36c; 標題一&#xff1a;貪心核心思想——發糖果時的最優分配策略 貪心算法 (Greedy Algorithm) 是一種簡單直觀的算法策略。它在每一步選擇中都采取在當前狀態下最好或最優&#xff08;即最有利&#xff09;的選擇&#xff0c;從而希望得到一個全局最優解。這就像你…

CPP中CAS std::chrono 信號量與Any類的手動實現

前言 CAS&#xff08;Compare and Swap&#xff09; 是一種用于多線程同步的原子指令。它通過比較和交換操作來確保數據的一致性和線程安全性。CAS操作涉及三個操作數&#xff1a;內存位置V、預期值E和新值U。當且僅當內存位置V的值與預期值E相等時&#xff0c;CAS才會將內存位…

Axure設計案例——科技感對比柱狀圖

想讓數據對比展示擺脫平淡無奇&#xff0c;瞬間抓住觀眾的眼球嗎&#xff1f;那就來看看這個Axure設計的科技感對比柱狀圖案例&#xff01;科技感設計風格運用獨特元素打破傳統對比柱狀圖的常規&#xff0c;營造出一種極具沖擊力的視覺氛圍。每一組柱狀體都仿佛是科技戰場上的士…

怒更一波免費聲音克隆和AI配音功能

寶子們&#xff01; 最近咱軟件TransDuck的免費聲音克隆和AI配音功能被大家用爆啦&#xff01;感謝各位自來水瘋狂安利&#xff01;&#xff01; DD這里也是收到好多用戶提的寶貴建議&#xff01;所以&#xff0c;連夜肝了波更新&#xff01; 這次重點更新使用克隆音色進行A…

UDP協議原理與Java編程實戰:無連接通信的奧秘

1.UDP協議核心原理 1. 無連接特性&#xff1a;快速通信的基石 UDP&#xff08;User Datagram Protocol&#xff0c;用戶數據報協議&#xff09;是TCP/IP協議族中無連接的輕量級傳輸層協議。與TCP的“三次握手”建立連接不同&#xff0c;UDP通信無需提前建立鏈路&#xff0c;發送…

vue-seamless-scroll 結束從頭開始,加延時后滾動

今天遇到一個大屏需求&#xff1a; 1??初始進入頁面停留5秒&#xff0c;然后開始滾動 2??最后一條數據出現在最后一行時候暫停5秒&#xff0c;然后返回1?? 依次循環&#xff0c;發現vue-seamless-scroll的方法 ScrollEnd是監測最后一條數據消失在第一行才回調&#xff…

[Protobuf] 快速上手:安全高效的序列化指南

標題&#xff1a;[Protobuf] (1)快速上手 水墨不寫bug 文章目錄 一、什么是protobuf&#xff1f;二、protobuf的特點三、使用protobuf的過程&#xff1f;1、定義消息格式&#xff08;.proto文件&#xff09;(1)指定語法版本(2)package 聲明符 2、使用protoc編譯器生成代碼&…

uniapp調用java接口 跨域問題

前言 之前在Windows10本地 調試一個舊項目&#xff0c;手機移動端用的是Uni-app&#xff0c;vue的版本是v2。后端是java spring-boot。運行手機移動端的首頁請求后臺接口老是提示錯誤信息。 錯誤信息如下&#xff1a; Access to XMLHttpRequest at http://localhost:8080/api/…

[ Qt ] | Qlabel使用

目錄 屬性 setTextFormat 插入圖片 設置圖片根據窗口大小實時變化 邊框和對其方式 ?編輯 設置縮進 設置伙伴 Qlabel可以用來顯式圖片和文字 屬性 text textFormat Qlabel獨有的機制&#xff1a;buddy setTextFormat 插入圖片 設置圖片根據窗口大小實時變化 Qt中表…

Springboot 項目一啟動就獲取HttpSession

在 Spring Boot 項目中&#xff0c;HttpSession 是有狀態的&#xff0c;通常只有在用戶發起 HTTP 請求并建立會話后才會創建。因此&#xff0c;在項目啟動時&#xff08;即應用剛啟動還未處理任何請求&#xff09;是無法獲取到 HttpSession 的。 方法一&#xff1a;使用 HttpS…

Step9—Ambari Web UI 初始化安裝 (Ambari3.0.0)

Ambari Web UI 安裝 如果還不會系統性的部署&#xff0c;或者前置內容不熟悉&#xff0c;建議從Step1 開始閱讀。不通版本針對于不同操作系統可能存在差異&#xff01;這里我也整理好了 https://doc.janettr.com/install/manual/ 1. 進入 Ambari Web UI 并登錄 在瀏覽器中訪…