Linux環(huán)境下Mysql與C相關(guān)技術(shù)文檔_第1頁
Linux環(huán)境下Mysql與C相關(guān)技術(shù)文檔_第2頁
Linux環(huán)境下Mysql與C相關(guān)技術(shù)文檔_第3頁
Linux環(huán)境下Mysql與C相關(guān)技術(shù)文檔_第4頁
Linux環(huán)境下Mysql與C相關(guān)技術(shù)文檔_第5頁
已閱讀5頁,還剩12頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、Linux環(huán)境下Mysql與C相關(guān)技術(shù)文檔擬制:李邦柱日期:2014-9-18審核:日期:批準(zhǔn):日期:文檔編號:YFZX-LIBZ-004創(chuàng)建日期:2014-9-18最后修改日期:2014-09-18版 本 號:V1.0電子版文件名:linux環(huán)境下mysql與C相關(guān)技術(shù)文檔.doc 文檔修改記錄修改日期修改人修改說明版本號修改頁C與Mysql技術(shù)文檔 第 17 頁 共 17 頁17目 錄Linux環(huán)境下Mysql與C相關(guān)技術(shù)文檔11 概述32 安裝mysql32.1 通過網(wǎng)絡(luò)安裝mysql32.1.1 檢查是否已經(jīng)安裝mysql42.1.2 通過yum來進(jìn)行mysql的安裝42.2 離線安裝

2、mysql52.2.1 檢查是否安裝mysql52.2.2 通過rpm安裝mysql52.3 mysql設(shè)置密碼62.4 mysql設(shè)置開機啟動62.5 Mysql數(shù)據(jù)庫的主要配置63 C與Mysql73.1 Mysql C API 函數(shù)概述73.2 API使用的一般原則114 C API使用示例134.1 連接數(shù)據(jù)庫134.2 數(shù)據(jù)庫查詢144.3 數(shù)據(jù)庫插入數(shù)據(jù)154.4 數(shù)據(jù)庫刪除171 概述 MySQL 是一個關(guān)系型數(shù)據(jù)庫管理系統(tǒng),由瑞典MySQL AB公司開發(fā),目前屬于Oracle公司。MySQL是最流行的關(guān)系型數(shù)據(jù)庫管理系統(tǒng)。 支持AIX、FreeBSD、HP-UX、Linux、M

3、ac OS、NovellNetware、OpenBSD、OS/2 Wrap、Solaris、Windows等多種操作系統(tǒng)。 為多種編程語言提供了API。這些編程語言包括C、C+、Python、Java、Perl、PHP、Eiffel、Ruby,.NET和Tcl等。2 安裝mysql2.1 通過網(wǎng)絡(luò)安裝mysql2.1.1 檢查是否已經(jīng)安裝mysql # rpm -qa | grep mysql / 上述命令就會查看該操作系統(tǒng)上是否已經(jīng)安裝了mysql數(shù)據(jù)庫 有的話,我們就通過 rpm -e 命令 或者 rpm -e -nodeps 命令來卸載掉 #rpm -e -nodeps mysql 在刪

4、除完以后我們可以通過 rpm -qa | grep mysql 命令來查看mysql是否已經(jīng)卸載成功!2.1.2 通過yum來進(jìn)行mysql的安裝 #yum install -y mysql-server mysql mysql-deve 通過輸入 yum install -y mysql-server mysql mysql-devel 命令將mysql mysql-server mysql-devel都安裝好(注意:安裝mysql時我們并不是安裝了mysql客戶端就相當(dāng)于安裝好了mysql數(shù)據(jù)庫了,我們還需要安裝mysql-server服務(wù)端才行) 通過yum方式安裝mysql數(shù)據(jù)庫省去了

5、很多沒必要的麻煩,當(dāng)出現(xiàn)下面的結(jié)果時,就代表mysql數(shù)據(jù)庫安裝成功了 此時我們可以通過如下命令,查看剛安裝好的mysql-server的版本 #rpm -qi mysql-server2.2 離線安裝mysql2.2.1 檢查是否安裝mysql方法同.2 通過rpm安裝mysql 1. 需要準(zhǔn)備離線安裝包 MySQL-server-5.5.30-1.el6.x86_64.rpm MySQL-client-5.5.30-1.el6.x86_64.rpm MySQL-devel-5.5.30-1.el6.x86_64.rpm 2.安裝新的MySQL #rpm -ivh MySQL

6、-server-5.5.30-1.el6.x86_64.rpm #rpm -ivh MySQL-client-5.5.30-1.el6.x86_64.rpm #rpm -ivh MySQL-devel-5.5.30-1.el6.x86_64.rpm 3.啟動MySQL服務(wù) #service mysql start 4.查看mysql運行狀態(tài) #/etc/rc.d/init.d/mysqld status 5.MySQL服務(wù)一些其他命令 a、察看mysql是否在自動啟動列表: #/sbin/chkconfig list b、添加mysql到系統(tǒng)自啟動服務(wù)組: #/sbin/chkconfig a

7、ddmysql c、把mysql從啟動服務(wù)組中刪除: #/sbin/chkconfig delmysql d、停止mysql服務(wù): # service mysqld stop e、腳本啟動mysql服務(wù): # /etc/rc.d/init.d/mysqld start f、腳本停止mysql服務(wù): # /etc/rc.d/init.d/mysqld stop2.3 mysql設(shè)置密碼命令如下: # /usr/bin/mysqladmin -u root password '123456'2.4 mysql設(shè)置開機啟動 查看Mysql服務(wù)是否是開機啟動 命令如下:

8、#chkconfig -list | grep mysqld 設(shè)置開機啟動命令如下: # chkconfig mysqld on2.5 Mysql數(shù)據(jù)庫的主要配置/etc/f 這是mysql的主配置文件我們可以查看一下這個文件的一些信息# cat f mysqlddatadir=/var/lib/mysqlsocket=/var/lib/mysql/mysql.sockuser=mysql# Disabling symbolic-links is recommended to prevent assorted security riskssymbolic-links=0mysq

9、ld_safelog-error=/var/log/mysqld.logpid-file=/var/run/mysqld/mysqld.pid簡要介紹./var/lib/mysql mysql數(shù)據(jù)庫的數(shù)據(jù)庫文件存放位置./var/log mysql數(shù)據(jù)庫的日志輸出存放位置3 C與Mysql3.1 Mysql C API 函數(shù)概述這里歸納了C API可使用的函數(shù)函數(shù)描述mysql_affected_rows()返回上次UPDATE、DELETE或INSERT查詢更改刪除插入的行數(shù)。mysql_autocommit()切換 autocommit模式,ON/OFFmysql_change_

10、user()更改打開連接上的用戶和數(shù)據(jù)庫。mysql_charset_name()返回用于連接的默認(rèn)字符集的名稱。mysql_close()關(guān)閉服務(wù)器連接。mysql_commit()提交事務(wù)。mysql_connect()連接到MySQL服務(wù)器。該函數(shù)已不再被重視,使用mysql_real_connect()取代。mysql_create_db()創(chuàng)建數(shù)據(jù)庫。該函數(shù)已不再被重視,使用SQL語句CREATE DATABASE取而代之。mysql_data_seek()在查詢結(jié)果集中查找屬性行編號。mysql_debug()用給定的字符串執(zhí)行DBUG_PUSH。mysql_drop_db()撤銷

11、數(shù)據(jù)庫。該函數(shù)已不再被重視,使用SQL語句DROP DATABASE取而代之。mysql_dump_debug_info()讓服務(wù)器將調(diào)試信息寫入日志。mysql_eof()確定是否讀取了結(jié)果集的最后一行。該函數(shù)已不再被重視,可以使用mysql_errno()或mysql_error()取而代之。mysql_errno()返回上次調(diào)用的MySQL函數(shù)的錯誤編號。mysql_error()返回上次調(diào)用的MySQL函數(shù)的錯誤消息。mysql_escape_string()為了用在SQL語句中,對特殊字符進(jìn)行轉(zhuǎn)義處理。mysql_fetch_field()返回下一個表字段的類型。mysql_fetc

12、h_field_direct()給定字段編號,返回表字段的類型。mysql_fetch_fields()返回所有字段結(jié)構(gòu)的數(shù)組。mysql_fetch_lengths()返回當(dāng)前行中所有列的長度。mysql_fetch_row()從結(jié)果集中獲取下一行mysql_field_seek()將列光標(biāo)置于指定的列。mysql_field_count()返回上次執(zhí)行語句的結(jié)果列的數(shù)目。mysql_field_tell()返回上次mysql_fetch_field()所使用字段光標(biāo)的位置。mysql_free_result()釋放結(jié)果集使用的內(nèi)存。mysql_get_client_info()以字符串形式

13、返回客戶端版本信息。mysql_get_client_version()以整數(shù)形式返回客戶端版本信息。mysql_get_host_info()返回描述連接的字符串。mysql_get_server_version()以整數(shù)形式返回服務(wù)器的版本號。mysql_get_proto_info()返回連接所使用的協(xié)議版本。mysql_get_server_info()返回服務(wù)器的版本號。mysql_info()返回關(guān)于最近所執(zhí)行查詢的信息。mysql_init()獲取或初始化MYSQL結(jié)構(gòu)。mysql_insert_id()返回上一個查詢?yōu)锳UTO_INCREMENT列生成的ID。mysql_kil

14、l()殺死給定的線程。mysql_library_end()最終確定MySQL C API庫。mysql_library_init()初始化MySQL C API庫。mysql_list_dbs()返回與簡單正則表達(dá)式匹配的數(shù)據(jù)庫名稱。mysql_list_fields()返回與簡單正則表達(dá)式匹配的字段名稱。mysql_list_processes()返回當(dāng)前服務(wù)器線程的列表。mysql_list_tables()返回與簡單正則表達(dá)式匹配的表名。mysql_more_results()檢查是否還存在其他結(jié)果。mysql_next_result()在多語句執(zhí)行過程中返回/初始化下一個結(jié)果。mys

15、ql_num_fields()返回結(jié)果集中的列數(shù)。mysql_num_rows()返回結(jié)果集中的行數(shù)。mysql_options()為mysql_connect()設(shè)置連接選項。mysql_ping()檢查與服務(wù)器的連接是否工作,如有必要重新連接。mysql_query()執(zhí)行指定為“以Null終結(jié)的字符串”的SQL查詢。mysql_real_connect()連接到MySQL服務(wù)器。mysql_real_escape_string()考慮到連接的當(dāng)前字符集,為了在SQL語句中使用,對字符串中的特殊字符進(jìn)行轉(zhuǎn)義處理。mysql_real_query()執(zhí)行指定為計數(shù)字符串的SQL查詢。mysq

16、l_refresh()刷新或復(fù)位表和高速緩沖。mysql_reload()通知服務(wù)器再次加載授權(quán)表。mysql_rollback()回滾事務(wù)。mysql_row_seek()使用從mysql_row_tell()返回的值,查找結(jié)果集中的行偏移。mysql_row_tell()返回行光標(biāo)位置。mysql_select_db()選擇數(shù)據(jù)庫。mysql_server_end()最終確定嵌入式服務(wù)器庫。mysql_server_init()初始化嵌入式服務(wù)器庫。mysql_set_server_option()為連接設(shè)置選項(如多語句)。mysql_sqlstate()返回關(guān)于上一個錯誤的SQLSTA

17、TE錯誤代碼。mysql_shutdown()關(guān)閉數(shù)據(jù)庫服務(wù)器。mysql_stat()以字符串形式返回服務(wù)器狀態(tài)。mysql_store_result()檢索完整的結(jié)果集至客戶端。mysql_thread_id()返回當(dāng)前線程ID。mysql_thread_safe()如果客戶端已編譯為線程安全的,返回1。mysql_use_result()初始化逐行的結(jié)果集檢索。mysql_warning_count()返回上一個SQL語句的告警數(shù)。3.2 API使用的一般原則與MySQL交互時,應(yīng)用程序應(yīng)使用該一般性原則:1. 通過調(diào)用mysql_library_init(),初始化MySQL庫。庫可以

18、是mysqlclient C客戶端庫,或mysqld嵌入式服務(wù)器庫,具體情況取決于應(yīng)用程序是否與“-libmysqlclient”或“-libmysqld”標(biāo)志鏈接。2. 通過調(diào)用mysql_init()初始化連接處理程序,并通過調(diào)用mysql_real_connect()連接到服務(wù)器。3. 發(fā)出SQL語句并處理其結(jié)果。(在下面的討論中,詳細(xì)介紹了使用它的方法)。4. 通過調(diào)用mysql_close(),關(guān)閉與MySQL服務(wù)器的連接。5. 通過調(diào)用mysql_library_end(),結(jié)束MySQL庫的使用。調(diào)用mysql_library_init()和mysql_library_end()

19、的目的在于,為MySQL庫提供恰當(dāng)?shù)某跏蓟徒Y(jié)束處理。對于與客戶端庫鏈接的應(yīng)用程序,它們提供了改進(jìn)的內(nèi)存管理功能。如果不調(diào)用mysql_library_end(),內(nèi)存塊仍將保持分配狀態(tài)(這不會增加應(yīng)用程序使用的內(nèi)存量,但某些內(nèi)存泄漏檢測器將抗議它)。對于與嵌入式服務(wù)器鏈接的應(yīng)用程序,這些調(diào)用會啟動并停止服務(wù)器。mysql_library_init()和mysql_library_end()實際上是#define符號,這類符號使得它們等效于mysql_server_init()和mysql_server_end(),但其名稱更清楚地指明,無論應(yīng)用程序使用的是mysqlclient或mysqld

20、庫,啟動或結(jié)束MySQL庫時,應(yīng)調(diào)用它們。對于早期的MySQL版本,可調(diào)用mysql_server_init()和mysql_server_end()取而代之。如果愿意,可省略對mysql_library_init()的調(diào)用,這是因為,必要時,mysql_init()會自動調(diào)用它。要想連接到服務(wù)器,可調(diào)用mysql_init()來初始化連接處理程序,然后用該處理程序(以及其他信息,如主機名、用戶名和密碼)調(diào)用mysql_real_connect()。建立連接后,在低于5.0.3版的API中,mysql_real_connect()會將再連接標(biāo)志(MYSQL結(jié)構(gòu)的一部分)設(shè)置為1,或在較新的版本

21、中,將其設(shè)置為0。對于該標(biāo)志,值“1”指明,如果因連接丟失而無法執(zhí)行語句,放棄之前,會嘗試再次連接到服務(wù)器。從MySQL 5.0.13開始,可以在mysql_options()上使用MYSQL_OPT_RECONNECT選項,以控制再連接行為。完成連接后,調(diào)用mysql_close()中止它。當(dāng)連接處于活動狀態(tài)時,客戶端或許會使用mysql_query()或mysql_real_query()向服務(wù)器發(fā)出SQL查詢。兩者的差別在于,mysql_query()預(yù)期的查詢?yōu)橹付ǖ?、由Null終結(jié)的字符串,而mysql_real_query()預(yù)期的是計數(shù)字符串。如果字符串包含二進(jìn)制數(shù)據(jù)(其中可能包

22、含Null字節(jié)),就必須使用mysql_real_query()。對于每個非SELECT查詢(例如INSERT、UPDATE、DELETE),通過調(diào)用mysql_affected_rows(),可發(fā)現(xiàn)有多少行已被改變(影響)。對于SELECT查詢,能夠檢索作為結(jié)果集的行。注意,某些語句因其返回行,類似與SELECT。包括SHOW、DESCRIBE和EXPLAIN。應(yīng)按照對待SELECT語句的方式處理它們。客戶端處理結(jié)果集的方式有兩種。一種方式是,通過調(diào)用mysql_store_result(),一次性地檢索整個結(jié)果集。該函數(shù)能從服務(wù)器獲得查詢返回的所有行,并將它們保存在客戶端。第二種方式是針對

23、客戶端的,通過調(diào)用mysql_use_result(),對“按行”結(jié)果集檢索進(jìn)行初始化處理。該函數(shù)能初始化檢索結(jié)果,但不能從服務(wù)器獲得任何實際行。在這兩種情況下,均能通過調(diào)用mysql_fetch_row()訪問行。通過mysql_store_result(),mysql_fetch_row()能夠訪問以前從服務(wù)器獲得的行。通過mysql_use_result(),mysql_fetch_row()能夠?qū)嶋H地檢索來自服務(wù)器的行。通過調(diào)用mysql_fetch_lengths(),能獲得關(guān)于各行中數(shù)據(jù)大小的信息。完成結(jié)果集操作后,請調(diào)用mysql_free_result()釋放結(jié)果集使用的內(nèi)存。

24、這兩種檢索機制是互補的。客戶端程序應(yīng)選擇最能滿足其要求的方法。實際上,客戶端最常使用的是mysql_store_result()。mysql_store_result()的1個優(yōu)點在于,由于將行全部提取到了客戶端上,你不僅能連續(xù)訪問行,還能使用mysql_data_seek()或mysql_row_seek()在結(jié)果集中向前或向后移動,以更改結(jié)果集內(nèi)當(dāng)前行的位置。通過調(diào)用mysql_num_rows(),還能發(fā)現(xiàn)有多少行。另一方面,對于大的結(jié)果集,mysql_store_result()所需的內(nèi)存可能會很大,你很可能遇到內(nèi)存溢出狀況。mysql_use_result()的1個優(yōu)點在于,客戶端所

25、需的用于結(jié)果集的內(nèi)存較少,原因在于,一次它僅維護(hù)一行(由于分配開銷較低,mysql_use_result()能更快)。它的缺點在于,你必須快速處理每一行以避免妨礙服務(wù)器,你不能隨機訪問結(jié)果集中的行(只能連續(xù)訪問行),你不知道結(jié)果集中有多少行,直至全部檢索了它們?yōu)橹?。不僅如此,即使在檢索過程中你判定已找到所尋找的信息,也必須檢索所有的行。通過API,客戶端能夠恰當(dāng)?shù)貙Σ樵冏鞒鲰憫?yīng)(僅在必要時檢索行),而無需知道查詢是否是SELECT查詢??梢栽诿看蝝ysql_query()或mysql_real_query()后,通過調(diào)用mysql_store_result()完成該操作。如果結(jié)果集調(diào)用成功,查

26、詢?yōu)镾ELECT,而且能夠讀取行。如果結(jié)果集調(diào)用失敗,可調(diào)用mysql_field_count()來判斷結(jié)果是否的確是所預(yù)期的。如果mysql_field_count()返回0,查詢不返回數(shù)據(jù)(表明它是INSERT、UPDATE、DELETE等),而且不返回行。如果mysql_field_count()是非0值,查詢應(yīng)返回行,但沒有返回行。這表明查詢是失敗了的SELECT。關(guān)于如何實現(xiàn)該操作的示例,請參見關(guān)于mysql_field_count()的介紹。無論是mysql_store_result()還是mysql_use_result(),均允許你獲取關(guān)于構(gòu)成結(jié)果集的字段的信息(字段數(shù)目,它們

27、的名稱和類型等)。通過重復(fù)調(diào)用mysql_fetch_field(),可以按順序訪問行內(nèi)的字段信息,或者,通過調(diào)用mysql_fetch_field_direct(),能夠在行內(nèi)按字段編號訪問字段信息。通過調(diào)用mysql_field_seek(),可以改變當(dāng)前字段的光標(biāo)位置。對字段光標(biāo)的設(shè)置將影響后續(xù)的mysql_fetch_field()調(diào)用。此外,你也能通過調(diào)用mysql_fetch_fields(),一次性地獲得關(guān)于字段的所有信息。為了檢測和通報錯誤,MySQL提供了使用mysql_errno()和mysql_error()函數(shù)訪問錯誤信息的機制。它們能返回關(guān)于最近調(diào)用的函數(shù)的錯誤代碼或

28、錯誤消息,最近調(diào)用的函數(shù)可能成功也可能失敗,這樣,你就能判斷錯誤是在何時出現(xiàn)的,以及錯誤是什么。4 C API使用示例4.1 連接數(shù)據(jù)庫 /*練習(xí)mysql數(shù)據(jù)庫的連接*/ #include <stdio.h> #include <mysql.h> int main() MYSQL mysql; int t, r; /*連接之前,先用mysql_init初始化MYSQL連接句柄*/ mysql_init(&mysql); /*使用mysql_real_connect連接服務(wù)器,其參數(shù)依次為MYSQL句柄,服務(wù)器IP地址, 登錄mysql的用戶名,密碼,要連接的數(shù)

29、據(jù)庫等*/ if(!mysql_real_connect(&mysql, "localhost", "root", "6748355", "spytest", 0, NULL, 0) printf("Error connecting to Mysql!n"); else printf("Connected Mysql successful!n"); /*關(guān)閉連接*/ mysql_close(&mysql); return 0; 4.2 數(shù)據(jù)庫查詢/*練習(xí)mys

30、ql數(shù)據(jù)庫的查詢*/ #include <stdio.h> #include <string.h> #include "mysql.h" int main() MYSQL mysql; MYSQL_RES *res; MYSQL_ROW row; char *query; int flag, t; mysql_init(&mysql); if(!mysql_real_connect(&mysql, "localhost", "root", "6748355", "s

31、pytest", 0, NULL, 0) printf("Failed to connect to Mysql!n"); return 0; else printf("Connected to Mysql successfully!n"); query = "select * from log" /*查詢,成功則返回0*/ flag = mysql_real_query(&mysql, query, (unsigned int)strlen(query); if(flag) printf("Query fa

32、iled!n"); return 0; else printf("%s made.n", query); /*mysql_store_result講全部的查詢結(jié)果讀取到客戶端*/ res = mysql_store_result(&mysql); /*mysql_fetch_row檢索結(jié)果集的下一行*/ while(row = mysql_fetch_row(res) /*mysql_num_fields返回結(jié)果集中的字段數(shù)目*/ for(t=0; t<mysql_num_fields(res); t+) printf("%st"

33、, rowt); printf("n"); mysql_close(&mysql); return 0; 4.3 數(shù)據(jù)庫插入數(shù)據(jù)/*練習(xí)mysql數(shù)據(jù)庫的數(shù)據(jù)添加*/ #include <stdio.h> #include <string.h> #include "mysql.h" int main() MYSQL mysql; MYSQL_RES *res; MYSQL_ROW row; char *query; int flag, t; mysql_init(&mysql); if(!mysql_real_connect(&mysql, "localhost", "root", "6748355", "spytest", 0, NULL, 0) printf("Failed to connect to Mysql!n"); return 0; else printf("Connected to Mysql su

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論