為了方便應用程序的開發,MySQL提供了用C 編程語言編寫的客戶機庫,它允許從任何C 程序的內部訪問MySQL數據庫。客戶機庫實現應用程序編程接口( A P I),API 定義客戶機程序如何建立和執行與服務器的通信。
然而,使用C 來編寫MySQL程序並不受限制。許多其他語言處理器本身也是由C 編寫的,或具有使用C庫的能力,所以MySQL客戶機庫提供了這個方法,由此, MySQL對這些語言的約束可以建立在C API 的上面。這就為與MySQL服務器通信而編寫應用程序提供了許多選擇。客戶機程序的API 是用Perl、PHP、Java、Python、C++、Tcl 和其他一些語言編寫的。有關最新的清單,請查看MySQL參考指南或MySQLWeb 站點,因為有時會增加用新語言編寫的A P I。
每種語言約束都定義自己的接口,特別是訪問MySQL的規則。這裡沒有足夠的時間來討論MySQL可使用的每種A P I,我們只講述最流行的三種:
■ C 客戶機庫A P I。這是MySQL的基本編程接口。
■ Perl 通用目標腳本語言的DBI(數據庫接口) A P I。DBI 是作為與其他模塊在DB D(數據庫驅動程序)級接口的Perl 模塊來實現的,每個模塊都提供對特定類型的數據庫引擎的訪問(當然,我們將討論的特定的DBD 模塊也提供對MySQL的支持)。DBI 對MySQL的最普遍用法是編寫由命令行來調用的獨立的客戶機,以及試圖由Web 服務器調用的腳本來提供Web 對MySQL的訪問。
■ PHP API。PHP 是一種腳本語言,它提供了在Web 頁中嵌入程序的一種便利的方法。在發送以前,這樣的頁面由PHP來處理,它允許這些腳本生成動態的內容,如在頁面中包括MySQL查詢的結果。“PHP”原始的意思是個人主頁( Personal Home Page),但是PHP 的成長已經遠遠超過它簡單的原始功能。PHP Web 站點現在使用的這個名稱表示“PHP:超文本預處理程序( Hypertext Preprocessor)”,它像GNU (是GUN而不是UNIX )一樣以同樣的方式自我引用。
使用他人成果
當標准的MySQL客戶機不能滿足需要時,您並不總是需要編寫自己的程序。其他一些人一直編寫程序,而這些程序中有許多是可共享得到的。請參閱附錄I 中的一些樣例。只要找到幾個就能節省您的許多工作。
以上這三種A P I都有專門章節詳細說明。本章只提供對API 比較的概述,用來說明它們的基本特征,並給出對特定的應用程序可能選擇某個而不是其他API 的原因。
當然,不必只考慮某個API,應了解每個API,並用可以明智選擇適合自己的API。在包括若干組件的大項目中,可能使用多個API,多種語言,這取決於每個子任務適合哪一種語言。
對於試圖使用的任何一種API,如果需要得到必需的軟件,請參閱附錄A。
5.1.1C API
CAPI 用於編譯C 程序上下文環境內部。它是一種客戶機庫,提供可用來與MySQL服務器對話的最低級別的接口——具有創建與服務器通信所需的能力。DBI 和PHP 的前身DBI 的Perl 前身是Mysqlperl 模塊M y s q l . p m。這個模塊不再被支持,而且不應該用於新的MySQL的開發。有一件事需要明白,Mysqlperl 是依賴於MySQL的,但DBI 不是。如果編寫MySQL的Perl 應用程序,然後,決定想用另外一種數據庫引擎來使用它們,則移植DBI 腳本比MySQLperl 腳本更容易一些,因為它們很少依賴於特定的數據庫引擎。如果獲取了訪問MySQL的一段Perl 腳本,並發現它是用Mysqlperl 而不是DBI 編寫的,則仍然可以使用DBI。DBI 包括了對Mysqlperl 的仿真支持,因此不需要安裝兩個程序包。PHP 3 的前身是PHP/FI 2.0 (F I代表“ form interpreter ,即格式解釋程序”)。像MySQLperl 一樣,PHP / F I也是過時的,所以我們就不再進一步討論它了。
MySQLC API 的起源如果已經有編寫mSQL RDBMS 程序的經驗,那麼將注意到MySQLC API 類似於mSQL 相應的C API。當MySQL的開發者們開始實現他們的SQL 引擎時,許多有用的共享實用程序可用於m SQL。要想花費最小的難度將那些mSQL 實用程序移植為MySQL的
實用程序是可能的,可有意地將MySQLAPI設計為與mSQL API 類似(MySQL甚至帶有與mSQL API 函數名稱相應的MySQL名稱的簡單的文本替代品的msql2mysql腳本。這個操作相對煩瑣,實際上也照顧了許多涉及為使用MySQL而轉換mSQL 程序的工作)。
MySQL分發包提供的C 客戶機是基於這個API 的。C 客戶機庫也作為MySQL對其他語言約束的基礎來提供服務,但Java API 是一個例外。例如,通過連接MySQLC 客戶機庫代碼(這個過程在附錄A中通過DBI 和PHP 安裝指導來舉例說明),MySQL可用Perl DBI 模塊專有的MySQL驅動程序和PHP 代碼。
5.1.2 Perl DBI APIDBI API 用於Perl 腳本語言編寫的應用程序的上下文環境內部。這種API 在我們考慮的這三種API 結構中是最高的,因為它可與許多數據庫工作,而同時在腳本中可忽略許多特定數據庫的細節。DBI 經過使用兩級結構的Perl 模塊來實現(請參閱圖5 - 1):
■ DBI (數據庫接口)級。為客戶機腳本提供接口。這個級別提供的是抽象接口,並不是指特定數據庫引擎。
■ DBD (數據庫驅動器)級。在這個級別由特定引擎的驅動程序來提供對各種數據庫引擎的支持。
MySQL對DBI 的支持環境由Msql - Mysql - modules分發包提供。這個模塊在DBD 級操作。可以從分發包名稱及圖5 - 1中分辨它,一個驅動程序可以提供對一個以上的RDBMS 的支持。Msql-Mysql-Modules 最初是為mSQL 而編寫的,後來擴展到MySQL。這種影響類似於對mSQL 和MySQL的CAPI。由於設計的MySQLCAPI 類似於mSQL CAPI,所以將mSQL DBD(使用mSQL C API)擴展到對MySQL的使用很有意義。
DBI 體系結構編寫應用程序的風格相對普通。當編寫DBI 腳本時,可使用一組標准的調用。DBI 級在DBD 級調用適當的驅動程序來處理請求,對於想使用的特定數據庫服務器通信中包括的特定問題,由驅動程序處理。DBD 級傳送從服務器返回的數據,備份到DBI 級,使數據出現在應用程序中。數據的格式與數據庫的數據來源一致。
其結果得到這樣一個接口,該接口從應用程序的編寫者的觀點隱藏了數據庫引擎之間的差異,這樣可使用多種不同的引擎——和驅動程序一樣多。DBI 通過允許以統一風格訪問每個數據庫來提供一致性客戶接口以增加可移植性。
當打開數據庫時,出現由腳本編寫的數據庫專有的界面。當創建連接時,應指出使用哪個驅動程序。例如,要想使用MySQL數據庫,應這樣連接:
而要想使用Postgres 或m SQL,應這樣連接:
連接以後,對該驅動程序不需要再做任何做特殊的引用。讓DBI 和該驅動程序解決數據庫專有的細節。
無論如何這都是理論問題。然而,至少有兩個因素與DBI 腳本的可移植性矛盾:
■ 在RDBMS 引擎之間SQL 的實現不同,為一個引擎編寫的SQL 另一個引擎根本不理解是完全可能的。如果SQL 相當通用,則腳本可在引擎之間作相應的移植。但如果SQL 依賴於引擎,則腳本也是這樣。例如,如果使用MySQL指定的SHOW TABLES語句,則該腳本不能用其他數據庫執行。
■ DBD 模塊通常提供引擎專有類型的信息來允許腳本編寫者使用特定數據庫系統的特定功能。例如, MySQLDBD 提供訪問查詢結果中列屬性的方法,如每列的最大長度、列是否是數值型的,等等。而這些屬性在其他數據庫中沒有任何相似物。DBD 專有的特性與可移植性相背,通過使用它們,將MySQL編寫的腳本用於其他數據庫系統是困難的(然而,在第7章中,您將發現,筆者毫不費力地避免了由MySQLDBD 提供的MySQL專有的結構。那是因為您應該知道那些結構是什麼,以便可以決定自己是否使用它們)。
盡管存在數據庫專有腳本的這兩個因素,但以抽象方式提供數據庫訪問的DBI 機制是完成可移植性的合理方式,只要您決定利用它多少次即可。
5.1.3 PHP API
像Perl 一樣,PHP 也是一種腳本語言。但它與Perl 不同,PHP 很少作為通用目標語言來設計,而是作為編寫Web 應用程序的一種語言。PHP API 主要作為在Web 頁面中嵌入可執行腳本的一種方法來使用。這使Web 的開發者們很容易用動態生成上下文環境來編寫頁面。
當客戶浏覽器向Web 服務器發送PHP 頁面的請求時,PHP 執行在該頁面中它所發現的任何腳本,並用腳本的輸出來替換它。該結果再送回浏覽器。這就使浏覽器中實際出現的頁面根據請求的頁面環境的不同而有所不同。例如,當在Web 頁面中嵌入下面簡短的PHP 腳本時,它出現所請求頁面的主機I P地址:
可以使用腳本為訪問者提供基於數據庫上下文環境的最新信息。下面的樣例說明可用於Historical League Web 站點的一個簡單腳本。該腳本發布一個請求來確定當前的League 的成員數目,並將該數目報告給訪問該站點的人(如果出現錯誤,則該腳本不報告任何數目):
DBI和DBD的含義
盡管DBI 級是獨立於數據庫的,而DBD 級是依賴於數據庫的,但那並不是“ DBI”和“DBD”所代表的意義。它們的意思是“數據庫接口”和“數據庫驅動程序”。
PHP 腳本通常看起來像是帶有嵌入在“ <?p h p”和“?>”標識符中的腳本的HTML 頁面。一個頁面可能包括若干個腳本。這為腳本的開發提供了一種非常靈活的方法。例如,如果您喜歡,可以編寫一個正常的Html 頁面來創建通用的頁面框架,然後再增加腳本的內容。
對於不同的數據庫引擎,PHP 對統一的接口不再作任何事情, DBI 也用這種方法。取而代之,每個引擎的接口看起來非常像相應的實現該引擎低級API 的C 庫接口。例如,用於從PHP 腳本內部訪問MySQL的PHP 函數的名稱非常類似於MySQLC 客戶庫中函數的名稱。