當(dāng)前位置:
首頁 >
Mysql —— linux下使用c语言访问mySql数据库
發(fā)布時(shí)間:2025/10/17
60
豆豆
生活随笔
收集整理的這篇文章主要介紹了
Mysql —— linux下使用c语言访问mySql数据库
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
示例1:#include<stdio.h>#include<mysql.h>int?main(){MYSQL?mysql;mysql_init(&mysql);if(!mysql_real_connect(&mysql,"host","user","passwd","database",0,NULL,0)){fprintf(stderr,"Failedtoconnecttodatabase:Error:%s\n",mysql_error(&mysql));}mysql_close(&mysql);return?0;}示例2(linux下使用c語言訪問mySql數(shù)據(jù)庫):
/********************************************* 編譯命令:gcc aa.c -lmysqlclient -o aa* 執(zhí)行命令:./aa* ******************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "mysql/mysql.h"MYSQL *g_conn;//mysql 鏈接
MYSQL_RES *g_res;//mysql 記錄集
MYSQL_ROW g_row;//字符串?dāng)?shù)組,mysql 記錄行const char *g_host_name = "localhost";
const char *g_user_name = "root";
const char *g_password = "asdfgh";
const char *g_db_name = "test";
const unsigned int g_db_port = 3306;#define MAX_BUF_SIZE 1024 //緩沖區(qū)最大字節(jié)數(shù)
char sql[MAX_BUF_SIZE];
char Time[MAX_BUF_SIZE];int iNum_rows = 0;//mysql語句執(zhí)行結(jié)果返回行數(shù)賦初值
int flag = 0;//管理員權(quán)限開關(guān)
int i = 1;//系統(tǒng)運(yùn)行開關(guān) /***************************************************** time : 20180622* addby : swj* function :print_mysql_error() 打印錯(cuò)誤信息* ******************************************************/
void print_mysql_error(const char *msg)
{if(msg)printf("%s: %s\n",msg,mysql_error(g_conn));elseputs(mysql_error(g_conn));
}
/***************************************************** time : 20180622* addby : swj* function :executesql() 執(zhí)行sql語句,成功返回0,失敗返回-1 ******************************************************/
int executesql(const char * sql)
{if(mysql_real_query(g_conn,sql,strlen(sql)))return -1;return 0;
}
/***************************************************** time : 20180622* addby : swj* function :init_mysql() 初始化鏈接******************************************************/
int init_mysql()
{//init the database connection g_conn = mysql_init(NULL);//connection the database if(!mysql_real_connect(g_conn,g_host_name,g_user_name,g_password,g_db_name,g_db_port,NULL,0))return -1;//鏈接失敗if(executesql("set names utf8"))return -1;return 0; //返回成功
}
/***************************************************** * time : 20180622* * addby : swj* * function :create_database() 選擇數(shù)據(jù)庫 沒有的時(shí)候 創(chuàng)建數(shù)據(jù);有的時(shí)候 進(jìn)去數(shù)據(jù)* 庫 * ******************************************************/
void create_database()
{sprintf(sql,"use workdata");if(executesql(sql) == -1){puts("create database");executesql("create database workdata;");print_mysql_error(NULL);puts("choice database");executesql("use workdata;");print_mysql_error(NULL);puts("!!!Initialize the success!!!");}else{executesql("use workdata;");print_mysql_error(NULL);}}
/***************************************************** * time : 20180622* * addby : swj* * function :create_table() 創(chuàng)建表 * ******************************************************/
void create_table()
{sprintf(sql,"show tables;");executesql(sql);g_res = mysql_store_result(g_conn);iNum_rows = mysql_num_rows(g_res);if(iNum_rows == 0){puts("create users table");executesql("create table users(id_ int(11) unsigned primary key auto_increment,name_ char(255) not null unique,password_ char(32) not null,create_time_ datetime,creator_id_ int(11) unsigned,auth_type_ int(11) not null,dyn_sn_ char(10),dyn_pass_sn_ text,remark_ varchar(200),foreign key(creator_id_) references users(id_));");}mysql_free_result(g_res);//釋放結(jié)果集
}
/***************************************************** * time : 20180622* * addby : swj* * function :init_administrator() 初始化管理員賬戶* * 管理員用戶名:root 密碼:root* * ******************************************************/
void init_administrator()
{sprintf(sql,"select * from users where id_='1' and name_='root';");executesql(sql);g_res = mysql_store_result(g_conn);iNum_rows = mysql_num_rows(g_res);if(iNum_rows == 0){puts("Init Administrtor User");sprintf(sql,"insert into users values(1,'root','root','2017-08-18 12:21:11',1,0,'','','0:VIP 1:local pwd 2:local cert');");executesql(sql);}mysql_free_result(g_res);//釋放結(jié)果集
}
int main(void)
{puts("!!!The system is initializing!!!");/*初始化鏈接*///在初始化的時(shí)候 數(shù)據(jù)庫 test 是必須事先創(chuàng)建好的 否則會(huì)報(bào)錯(cuò)Unknown database 'test' if(init_mysql())print_mysql_error(NULL);//當(dāng)鏈接數(shù)據(jù)庫時(shí)候 有錯(cuò)誤 會(huì)報(bào)錯(cuò)//選擇數(shù)據(jù)庫workdata 沒有的時(shí)候 創(chuàng)建數(shù)據(jù)庫 有的時(shí)候 進(jìn)去數(shù)據(jù)庫create_database(); //創(chuàng)建表create_table();//初始化管理員賬戶init_administrator();
//操作數(shù)據(jù)庫 查詢數(shù)據(jù)庫 表中的信息if(executesql("select * from users"))print_mysql_error(NULL);g_res = mysql_store_result(g_conn); // 從服務(wù)器傳送結(jié)果集至本地,mysql_use_result直接使用服務(wù)器上的記錄集 int iNum_rows = mysql_num_rows(g_res); // 得到記錄的行數(shù) int iNum_fields = mysql_num_fields(g_res); // 得到記錄的列數(shù) printf("共%d個(gè)記錄,每個(gè)記錄%d字段\n", iNum_rows, iNum_fields);printf("id_ | name_ |password_| create_time_ |creator_id_ | auth_type_ |dyn_sn_| dyn_pass_sn_ |remark_ \n");while ((g_row=mysql_fetch_row(g_res))) // 打印結(jié)果集printf("%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n",g_row[0],g_row[1],g_row[2],g_row[3],g_row[4],g_row[5],g_row[6],g_row[7],g_row[8]); // 第一,第二字段mysql_free_result(g_res); // 釋放結(jié)果集mysql_close(g_conn);return EXIT_SUCCESS;
}
當(dāng)直接編譯.c文件的時(shí)候:會(huì)出現(xiàn)/tmp/ccp5dIsd.o:在函數(shù)‘print_mysql_error’中:aa.c:(.text+0x1e):對(duì)‘mysql_error’未定義的引用aa.c:(.text+0x48):對(duì)‘mysql_error’未定義的引用/tmp/ccp5dIsd.o:在函數(shù)‘executesql’中:aa.c:(.text+0x83):對(duì)‘mysql_real_query’未定義的引用………………錯(cuò)誤是因?yàn)闆]有進(jìn)行編譯gcc aa.c -lmysqlclient -o aa
當(dāng)test數(shù)據(jù)庫沒有事先創(chuàng)建好(Unknown database 'test'):當(dāng)test數(shù)據(jù)庫事先創(chuàng)建好:https://baike.baidu.com/item/mysql_real_connect/4007597?fr=aladdinmysql_real_connect中文名數(shù)據(jù)庫聯(lián)接參數(shù)外文名mysql_real_connect頭文件#include<mysql.h>函數(shù)說明運(yùn)行MySQL數(shù)據(jù)庫引擎建立連接
函數(shù)原型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 client_flag)
第1個(gè)參數(shù)應(yīng)是已有MYSQL結(jié)構(gòu)的地址。調(diào)用mysql_real_connect()之前,必須調(diào)用mysql_init()來初始化MYSQL結(jié)構(gòu)。通過mysql_options()調(diào)用,可更改多種連接選項(xiàng)。
“host”的值必須是主機(jī)名或IP地址。如果“host”是NULL或字符串"localhost",連接將被視為與本地主機(jī)的連接。如果操作系統(tǒng)支持套接字(Unix)或命名管道(Windows),將使用它們而不是TCP/IP連接到服務(wù)器。(host參數(shù)決定了聯(lián)接的類型)
“user”參數(shù)包含用戶的MySQL登錄ID。如果“user”是NULL或空字符串"",用戶將被視為當(dāng)前用戶。在UNIX環(huán)境下,它是當(dāng)前的登錄名。在Windows ODBC下,必須明確指定當(dāng)前用戶名。
“passwd”參數(shù)包含用戶的密碼。如果“passwd”是NULL,僅會(huì)對(duì)該用戶的(擁有1個(gè)空密碼字段的)用戶表中的條目進(jìn)行匹配檢查。這樣,數(shù)據(jù)庫管理員就能按特定的方式設(shè)置MySQL權(quán)限系統(tǒng),根據(jù)用戶是否擁有指定的密碼,用戶將獲得不同的權(quán)限。
“db”是數(shù)據(jù)庫名稱。如果db為NULL,連接會(huì)將默認(rèn)的數(shù)據(jù)庫設(shè)為該值。
如果“port”不是0,其值將用作TCP/IP連接的端口號(hào)。注意,“host”參數(shù)決定了連接的類型。如果unix_socket不是NULL,該字符串描述了應(yīng)使用的套接字或命名管道。注意,“host”參數(shù)決定了連接的類型。
client_flag的值通常為0,但是,也能將其設(shè)置為下述標(biāo)志的組合,以允許特定功能:
返回值如果連接成功,返回MYSQL*連接句柄。如果連接失敗,返回NULL。對(duì)于成功的連接,返回值與第1個(gè)參數(shù)的值相同參考鏈接:https://blog.csdn.net/happy_stars_2016/article/details/52664656
| 1、聯(lián)接數(shù)據(jù)庫 (test需要提前創(chuàng)建好)2、創(chuàng)建新的數(shù)據(jù)庫(workdata)3、創(chuàng)建user表 4、向表中插入信息 作為管理員的信息5、使用sql語句查詢表中的信息 |
| 執(zhí)行結(jié)果顯示 |
當(dāng)test數(shù)據(jù)庫沒有事先創(chuàng)建好(Unknown database 'test'):當(dāng)test數(shù)據(jù)庫事先創(chuàng)建好:https://baike.baidu.com/item/mysql_real_connect/4007597?fr=aladdinmysql_real_connect中文名數(shù)據(jù)庫聯(lián)接參數(shù)外文名mysql_real_connect頭文件#include<mysql.h>函數(shù)說明運(yùn)行MySQL數(shù)據(jù)庫引擎建立連接
函數(shù)原型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 client_flag)
第1個(gè)參數(shù)應(yīng)是已有MYSQL結(jié)構(gòu)的地址。調(diào)用mysql_real_connect()之前,必須調(diào)用mysql_init()來初始化MYSQL結(jié)構(gòu)。通過mysql_options()調(diào)用,可更改多種連接選項(xiàng)。
“host”的值必須是主機(jī)名或IP地址。如果“host”是NULL或字符串"localhost",連接將被視為與本地主機(jī)的連接。如果操作系統(tǒng)支持套接字(Unix)或命名管道(Windows),將使用它們而不是TCP/IP連接到服務(wù)器。(host參數(shù)決定了聯(lián)接的類型)
“user”參數(shù)包含用戶的MySQL登錄ID。如果“user”是NULL或空字符串"",用戶將被視為當(dāng)前用戶。在UNIX環(huán)境下,它是當(dāng)前的登錄名。在Windows ODBC下,必須明確指定當(dāng)前用戶名。
“passwd”參數(shù)包含用戶的密碼。如果“passwd”是NULL,僅會(huì)對(duì)該用戶的(擁有1個(gè)空密碼字段的)用戶表中的條目進(jìn)行匹配檢查。這樣,數(shù)據(jù)庫管理員就能按特定的方式設(shè)置MySQL權(quán)限系統(tǒng),根據(jù)用戶是否擁有指定的密碼,用戶將獲得不同的權(quán)限。
“db”是數(shù)據(jù)庫名稱。如果db為NULL,連接會(huì)將默認(rèn)的數(shù)據(jù)庫設(shè)為該值。
如果“port”不是0,其值將用作TCP/IP連接的端口號(hào)。注意,“host”參數(shù)決定了連接的類型。如果unix_socket不是NULL,該字符串描述了應(yīng)使用的套接字或命名管道。注意,“host”參數(shù)決定了連接的類型。
client_flag的值通常為0,但是,也能將其設(shè)置為下述標(biāo)志的組合,以允許特定功能:
| 標(biāo)志名稱標(biāo)志描述CLIENT_COMPRESS使用壓縮協(xié)議。CLIENT_FOUND_ROWS返回發(fā)現(xiàn)的行數(shù)(匹配的),而不是受影響的行數(shù)。CLIENT_IGNORE_SPACE允許在函數(shù)名后使用空格。使所有的函數(shù)名成為保留字。CLIENT_INTERACTIVE關(guān)閉連接之前,允許interactive_timeout秒的不活動(dòng)時(shí)間。CLIENT_LOCAL_FILES允許LOAD DATA LOCAL處理功能。CLIENT_MULTI_STATEMENTS通知服務(wù)器,客戶端可能在單個(gè)字符串內(nèi)發(fā)送多條語句。CLIENT_MULTI_RESULTS通知服務(wù)器,客戶端能夠處理來自多語句執(zhí)行。CLIENT_NO_SCHEMA禁止db_name.tbl_name.col_name語法。CLIENT_ODBC客戶端是ODBC客戶端。它將mysqld變得更為ODBC友好。CLIENT_SSL使用SSL,該選項(xiàng)不應(yīng)由應(yīng)用程序設(shè)置,而是在客戶端庫內(nèi)部設(shè)置。對(duì)于某些參數(shù),能夠從選項(xiàng)文件獲得取值,而不是取得mysql_real_connect()調(diào)用中的確切值。為此,在調(diào)用mysql_real_connect()之前,應(yīng)與MYSQL_READ_DEFAULT_FILE或MYSQL_READ_DEFAULT_GROUP選項(xiàng)一起調(diào)用mysql_options()。隨后,在mysql_real_connect()調(diào)用中,為準(zhǔn)備從選項(xiàng)文件讀取值的每個(gè)參數(shù)指定“無值”值:對(duì)于host,指定NULL值或空字符串("")。對(duì)于user,指定NULL值或空字符串。對(duì)于passwd,指定NULL值。(對(duì)于密碼,mysql_real_connect()調(diào)用中的空字符串的值不能被選項(xiàng)文件中的字符串覆蓋,這是因?yàn)?#xff0c;空字符串明確指明MySQL賬戶必須有空密碼)。對(duì)于db,指定NULL值或空字符串對(duì)于port,指定“0”值。對(duì)于unix_socket,指定NULL值。對(duì)于某一參數(shù),如果在選項(xiàng)文件中未發(fā)現(xiàn)值,將使用它的默認(rèn)值,如本節(jié)前面介紹的那樣。 |
返回值如果連接成功,返回MYSQL*連接句柄。如果連接失敗,返回NULL。對(duì)于成功的連接,返回值與第1個(gè)參數(shù)的值相同參考鏈接:https://blog.csdn.net/happy_stars_2016/article/details/52664656
總結(jié)
以上是生活随笔為你收集整理的Mysql —— linux下使用c语言访问mySql数据库的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: shell脚本——expect命令
- 下一篇: Mysql —— C语言链接mysql数