最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

MySQL使用C語(yǔ)言連接完整代碼樣例

 更新時(shí)間:2025年03月03日 09:13:47   作者:Zfox_  
這篇文章主要介紹了如何使用C語(yǔ)言連接MySQL數(shù)據(jù)庫(kù),包括安裝MySQL連接庫(kù)、初始化MySQL、連接數(shù)據(jù)庫(kù)、執(zhí)行SQL查詢、獲取查詢結(jié)果、關(guān)閉連接等步驟,并提供了完整的代碼示例,需要的朋友可以參考下

一:MySQL connect

?? MySQL 的基礎(chǔ),我們之前已經(jīng)學(xué)過,后面我們只關(guān)心使用
要使用 C 語(yǔ)言連接 MySQL,需要使用 MySQL 官網(wǎng)提供的庫(kù),大家可以去官網(wǎng)下載
我們使用 C接口庫(kù)來進(jìn)行連接
要正確使用,我們需要做一些準(zhǔn)備工作:

  • 保證 mysql 服務(wù)有效
  • 在官網(wǎng)上下載合適自己平臺(tái)的 MySQL connect 庫(kù),以備后用
  • 建議直接使用命令 sudo yum install -y mysql-community-server 安裝

Connector / C 使用

  • ?? 我們下下來的庫(kù)格式如下:
# tree /usr/include/mysql
/usr/include/mysql
├── client_plugin.h
├── errmsg.h
├── field_types.h
├── my_command.h
├── my_compress.h
├── my_list.h
├── mysql_com.h
├── mysqld_error.h
├── mysql.h
├── mysql_time.h
├── mysql_version.h
├── mysqlx_ername.h
├── mysqlx_error.h
├── mysqlx_version.h
├── plugin_auth_common.h
└── udf_registration_types.h

lib
# find /usr -name "libmysqlclient*"
/usr/share/doc/libmysqlclient21
/usr/share/doc/libmysqlclient-dev
/usr/lib/x86_64-linux-gnu/libmysqlclient.so.21.2.40
/usr/lib/x86_64-linux-gnu/libmysqlclient.a
/usr/lib/x86_64-linux-gnu/libmysqlclient.so
/usr/lib/x86_64-linux-gnu/libmysqlclient.so.21

其中 include 包含所有的方法聲明, lib 包含所有的方法實(shí)現(xiàn)(打包成庫(kù))

嘗試鏈接 mysql client

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

#include <iostream>
#include <mysql/mysql.h>

int main()
{
	std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;
	return 0;
} 

$ g++ -o mytest test.cc -std=c++11 -lmysqlclient
$ ls
Makefile  mytest  test.cc

$ ./mytest 
mysql client version: 8.0.40

至此引入庫(kù)的工作已經(jīng)做完,接下來就是熟悉接口

mysql 接口介紹

MySQL官方文檔借口介紹

初始化 mysql_init()

要使用庫(kù),必須先進(jìn)行初始化!

初始化一個(gè) MYSQL對(duì)象 
MYSQL *mysql_init(MYSQL *mysql);

使用 mysql_init函數(shù)初始化一個(gè) MySQL 連接句柄,為后續(xù)操作做準(zhǔn)備。
如: MYSQL *mfp = mysql_init(NULL)

鏈接數(shù)據(jù)庫(kù) mysql_real_connect

初始化完畢之后,必須先鏈接數(shù)據(jù)庫(kù),在進(jìn)行后續(xù)操作。(mysql網(wǎng)絡(luò)部分是基于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);

//建立好鏈接之后,獲取英文沒有問題,如果獲取中文是亂碼:
//設(shè)置鏈接的默認(rèn)字符集是utf8,原始默認(rèn)是latin1
mysql_set_character_set(myfd, "utf8");

第一個(gè)參數(shù) MYSQL是 C api 中一個(gè)非常重要的對(duì)象(mysql_init的返回值),里面內(nèi)存非常豐富,有
port, dbname, charset 等連接基本參數(shù)。它也包含了一個(gè)叫 st_mysql_methods 的結(jié)構(gòu)體變量,該變量里面保存著很多函數(shù)指針,這些函數(shù)指針將會(huì)在數(shù)據(jù)庫(kù)連接成功以后的各種數(shù)據(jù)操作中被調(diào)用。
mysql_real_connect 函數(shù)中各參數(shù),基本都是顧名思意。

測(cè)試:

#include <iostream>
#include <unistd.h>
#include <string>
#include <mysql/mysql.h>

const std::string host = "127.0.0.1";
const std::string user = "connector";
const std::string passwd = "123456";
const std::string db = "conn";
const unsigned int port = 3306;

int main()
{
    std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;

    MYSQL* my = mysql_init(nullptr);
    if(my == nullptr)
    {
        std::cerr << "init MySQL error" << std::endl;
        return 1;
    }

    if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        std::cerr << "connect MYSQL error" << std::endl;
        return 2;
    }

    std::cout << "connect success" << std::endl;

    mysql_set_character_set(my, "utf8");    // 設(shè)置字符集
    
	mysql_close(my);

    return 0;
}

結(jié)果:

# ./mytest 
mysql client version: 8.0.40
connect success

下發(fā) mysql 命令 mysql_query

int mysql_query(MYSQL *mysql, const char *q);

第一個(gè)參數(shù)上面已經(jīng)介紹過,第二個(gè)參數(shù)為要執(zhí)行的sql語(yǔ)句,如“select * from table”。

獲取執(zhí)行結(jié)果 mysql_store_result sql 執(zhí)行完以后,如果是查詢語(yǔ)句,我們當(dāng)然還要讀取數(shù)據(jù),如果 update,insert 等語(yǔ)句,那么就看下操作成功與否即可。

#include <iostream>
#include <unistd.h>
#include <string>
#include <mysql/mysql.h>
const std::string host = "127.0.0.1";
const std::string user = "connector";
const std::string passwd = "123456";
const std::string db = "conn";
const unsigned int port = 3306;
int main()
{
    std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;
    MYSQL* my = mysql_init(nullptr);
    if(my == nullptr)
    {
        std::cerr << "init MySQL error" << std::endl;
        return 1;
    }
    if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        std::cerr << "connect MYSQL error" << std::endl;
        return 2;
    }
    std::cout << "connect success" << std::endl;
    mysql_set_character_set(my, "utf8");    // 設(shè)置字符集
	std::string sql;
    while(true)
    {
        std::cout << "MySQL>>> ";
        if(!std::getline(std::cin, sql) || sql == "quit") 
        {
            std::cout << "bye bye" << std::endl;
            break;
        }
        int n = mysql_query(my, sql.c_str());
        if(n == 0)
        {
            std::cout << sql << " success: " << n << std::endl;
        }
        else
        {
            std::cerr << sql << " failed" << n << std::endl;
        }
    } 
	mysql_close(my);
    return 0;
}

我們來看看如何獲取查詢結(jié)果: 如果 mysql_query 返回成功,那么我們就通過 mysql_store_result 這個(gè)函數(shù)來讀取結(jié)果。原型如下:

MYSQL_RES *mysql_store_result(MYSQL *mysql);

該函數(shù)會(huì)調(diào)用 MYSQL 變量中的 st_mysql_methods 中的 read_rows 函數(shù)指針來獲取查詢的結(jié)果。同時(shí)該函數(shù)會(huì)返回 MYSQL_RES 這樣一個(gè)變量,該變量主要用于保存查詢的結(jié)果。同時(shí)該函數(shù) malloc 了一片內(nèi)存空間來存儲(chǔ)查詢過來的數(shù)據(jù),所以我們一定要記的 free(result), 不然是肯定會(huì)造成內(nèi)存泄漏的。 執(zhí)行完 mysql_store_result 以后,其實(shí)數(shù)據(jù)都已經(jīng)在 MYSQL_RES 變量中了,下面的 api 基本就是讀取 MYSQL_RES 中的數(shù)據(jù)。

獲取結(jié)果行數(shù) mysql_num_rows
獲取結(jié)果列數(shù) mysql_num_fields
獲取列名 mysql_fetch_fields

如:

	int fields = mysql_num_fields(res);
	MYSQL_FIELD *field = mysql_fetch_fields(res);
	for(int i = 0; i < fields; i++)
	{
		cout<<field[i].name<<" ";
	} 

獲取結(jié)果內(nèi)容mysql_fetch_row

它會(huì)返回一個(gè)MYSQL_ROW變量,MYSQL_ROW其實(shí)就是char **. 就當(dāng)成一個(gè)二維數(shù)組來用吧

	MYSQL_ROW line;
	for(i = 0; i < nums; i++)
	{
		line = mysql_fetch_row(res);
		for(int j = 0; j < fields; j++)
		{
			cout << line[j] << " ";
		} 
	}

完整代碼樣例

#include <iostream>
#include <unistd.h>
#include <string>
#include <mysql/mysql.h>

const std::string host = "127.0.0.1";
const std::string user = "connector";
const std::string passwd = "123456";
const std::string db = "conn";
const unsigned int port = 3306;

int main()
{
    std::cout << "mysql client version: " << mysql_get_client_info() << std::endl;

    MYSQL* my = mysql_init(nullptr);
    if(my == nullptr)
    {
        std::cerr << "init MySQL error" << std::endl;
        return 1;
    }

    if(mysql_real_connect(my, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        std::cerr << "connect MYSQL error" << std::endl;
        return 2;
    }

    std::cout << "connect success" << std::endl;

    mysql_set_character_set(my, "utf8");    // 設(shè)置字符集

    //std::string sql = "update user set name='Jimmy' where id=2";
    //std::string sql = "insert into user (name, age, telphone) values ('peter', 19, 6543219876)";
    std::string sql = "select * from user";
    int n = mysql_query(my, sql.c_str());
    if(n == 0)  std::cout << sql << " success" << std::endl;
    else 
    {
        std::cerr << sql << " failed" << std::endl;
        return 3;
    }

    MYSQL_RES *res = mysql_store_result(my);
    if(res == nullptr)
    {
        std::cerr << "mysql_store_result error" << std::endl;
        return 4;
    }

    my_ulonglong rows = mysql_num_rows(res);
    my_ulonglong fields = mysql_num_fields(res);

    std::cout << "行: " << rows << std::endl;
    std::cout << "列: " << fields << std::endl;

    // 屬性
    MYSQL_FIELD *fields_array = mysql_fetch_fields(res);
    for(int i = 0; i < fields; i++)
    {
        std::cout << fields_array[i].name << '\t';
    }
    std::cout << '\n';

    // 內(nèi)容
    for(int i = 0; i < rows; i++)
    {
        MYSQL_ROW row = mysql_fetch_row(res);       // mysql_fetch_row相當(dāng)于一個(gè)迭代器,會(huì)自動(dòng)向后遍歷  MYSQL_ROW 就是一個(gè) char** 的二級(jí)指針
        for(int j = 0; j < fields; j++)
        {
            std::cout << row[j] << '\t';
        }
        std::cout << '\n';
    }

    mysql_free_result(res);

    mysql_close(my);

    return 0;
}

?? 關(guān)閉 mysql 鏈接 mysql_close

void mysql_close(MYSQL *sock);

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

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);

或者直接通過query函數(shù)直接操作都可以

總結(jié)

到此這篇關(guān)于MySQL使用C語(yǔ)言連接的文章就介紹到這了,更多相關(guān)MySQL使用C語(yǔ)言連接內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MYSQL updatexml()函數(shù)報(bào)錯(cuò)注入解析

    MYSQL updatexml()函數(shù)報(bào)錯(cuò)注入解析

    這篇文章主要介紹了MYSQL updatexml()函數(shù)報(bào)錯(cuò)注入解析,并且簡(jiǎn)單介紹了updatexml函數(shù),具有一定參考價(jià)值,需要的朋友可以了解下。
    2017-10-10
  • Mysql中事務(wù)ACID的實(shí)現(xiàn)原理詳解

    Mysql中事務(wù)ACID的實(shí)現(xiàn)原理詳解

    這篇文章主要給大家介紹了關(guān)于Mysql中事務(wù)ACID實(shí)現(xiàn)原理的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Mysql具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • Redis與MySQL如何保證雙寫一致性詳解

    Redis與MySQL如何保證雙寫一致性詳解

    雙寫一致性指的是當(dāng)我們更新了數(shù)據(jù)庫(kù)的數(shù)據(jù)之后redis中的數(shù)據(jù)?也要同步去更新,本文主要給大家詳細(xì)介紹了Redis與MySQL雙寫一致性如何保證,需要的朋友可以參考下
    2023-09-09
  • MYSQL必知必會(huì)讀書筆記第六章之過濾數(shù)據(jù)

    MYSQL必知必會(huì)讀書筆記第六章之過濾數(shù)據(jù)

    本文給大家分享MYSQL必知必會(huì)讀書筆記第六章之過濾數(shù)據(jù)的相關(guān)知識(shí),非常實(shí)用,特此分享到腳本之家平臺(tái),供大家參考
    2016-05-05
  • Mysql查詢語(yǔ)句如何實(shí)現(xiàn)無限層次父子關(guān)系查詢

    Mysql查詢語(yǔ)句如何實(shí)現(xiàn)無限層次父子關(guān)系查詢

    這篇文章主要介紹了Mysql查詢語(yǔ)句如何實(shí)現(xiàn)無限層次父子關(guān)系查詢問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • MySQL 多個(gè)%等模糊查詢功能實(shí)現(xiàn)

    MySQL 多個(gè)%等模糊查詢功能實(shí)現(xiàn)

    這篇文章主要介紹了MySQL 多個(gè)%等模糊查詢功能實(shí)現(xiàn),本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • mysql中workbench實(shí)例詳解

    mysql中workbench實(shí)例詳解

    在本篇文章里小編給大家分享了關(guān)于mysql中workbench實(shí)例內(nèi)容,有興趣的朋友們學(xué)習(xí)下。
    2019-01-01
  • MySQL ifnull()函數(shù)的具體使用

    MySQL ifnull()函數(shù)的具體使用

    本文主要介紹了MySQL ifnull()函數(shù)的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • MySQL 存儲(chǔ)引擎  MyISAM詳解(最新推薦)

    MySQL 存儲(chǔ)引擎  MyISAM詳解(最新推薦)

    使用 MyISAM 存儲(chǔ)引擎的表占用空間很小,但是由于使用表級(jí)鎖定,所以限制了讀/寫操作的性能,通常用于中小型的Web應(yīng)用和數(shù)據(jù)倉(cāng)庫(kù)配置中的只讀或主要是讀的場(chǎng)景,這篇文章主要介紹了MySQL 存儲(chǔ)引擎  MyISAM詳解,需要的朋友可以參考下
    2025-05-05
  • MySQL核心概念及SQL語(yǔ)句與數(shù)據(jù)類型詳解

    MySQL核心概念及SQL語(yǔ)句與數(shù)據(jù)類型詳解

    本文系統(tǒng)梳理MySQL從入門到進(jìn)階的核心知識(shí)體系,從數(shù)據(jù)庫(kù)基本概念、表關(guān)系模型到SQL語(yǔ)句分類與語(yǔ)法規(guī)范,重點(diǎn)拆解DDL庫(kù)表創(chuàng)建修改與DML增刪改查的實(shí)戰(zhàn)細(xì)節(jié),感興趣的朋友一起看看吧
    2026-05-05

最新評(píng)論

中方县| 来宾市| 昌吉市| 延津县| 奈曼旗| 平舆县| 新龙县| 阳城县| 霍邱县| 抚顺县| 南昌县| 化德县| 右玉县| 西昌市| 阿克| 绥江县| 都安| 尼玛县| 磐安县| 临高县| 牟定县| 辉县市| 秭归县| 吕梁市| 宁晋县| 太仓市| 城口县| 宁津县| 自治县| 忻城县| 区。| 琼结县| 宽甸| 遂平县| 谢通门县| 盘山县| 哈巴河县| 玉溪市| 合水县| 巴林左旗| 延边|