2008年4月27日

unixODBC 教學

在Windows上寫過資料庫程式的,應該都聽過ODBC這個東西,這東西全名是Open Database Connectivity,由M$所制定的,相關說明可以參考中文維基百科-ODBC或更詳細的英文維基百科-ODBC

簡單的說,M$為了統一所有資料庫系統在Windows上的存取方式,因此訂出了ODBC這樣的介面標準,並開放給資料庫廠商呼叫使用,而且美其名叫『Open Database Connectivity(開放資料庫互連)』,但實際上,開放在哪裡?
而且一直來說,都是M$說,別人做,哪來開放的道理?
更有趣的是,翻翻Visual C++、Visual C#、Visual Basic...等任何一本書,M$實際上建議大家使用ADO,並說使用ADO呼叫資料庫會有比較好的存取效率,因此我們完全可以認為,M$提供一個介面給別人用,但是包括他自己在內的所有人都知道,多一個介面來存取資料庫,並不會提昇效能。
不過這個介面並非都是缺點,有了ODBC,Windows上所有資料庫存取都有了統一的呼叫方式,這讓程式開發時,有了統一的資料庫呼叫,對資料轉移,程式碼的彈性都有幫助。

可惜ODBC的這一切都只在Windows上,事實上除了Windows之外,很多OS並沒有ODBC,結果說到底,感覺M$比較像是自己定規則給別人(ODBC),但是自己也建議別人不要用(建議用ADO)。

目前Linux/FreeBSD上已經有Open Source的ODBC實作,要設定使用都很容易,教學如下:
===================================
Linux 上要設定 ODBC 很容易,首先要知道,Linux 上的 ODBC 有兩套,分別是:
iODBC
unixODBC

這裡我們使用 unixODBC,並搭配 MySQL。

使用 Ubuntu 時(Debian 應該一樣),安裝套件:
unixodbc unixODBC 主程式
unixodbc-bin unixODBC 圖形化設定介面
libmyodbc MySQL 的 unixODBC Driver

安裝好之後,要設定很容易,他的設定分 2 部分:
一個部分是設定 unixODBC 的 Driver,MySQL Driver 的設定有提供 example,位置如下:
/usr/share/libmyodbc/odbcinst.ini

如果是第一次安裝 unixODBC,這時候正常是沒有任何 Driver 設定的,
那我們可以簡單的直接把設定檔複製到 /etc/ 下,如下:

# cp /usr/share/libmyodbc/odbcinst.ini /etc/

如果曾經安裝過其他 Driver,
我們可以把 /usr/share/libmyodbc/odbcinst.ini 內容加入到 /etc/odbcinst.ini

另一部份就要先提 Windows 上 ODBC 的設定,
在 Windows 上『控制台』->『系統管理程式』有個『ODBC資料來源

裡面可以設定 ODBC 的資料庫來源,內容包括 SQL Server IP、帳號、密碼、資料庫名稱...等,
然後只需要透過 ODBC 的名稱來使用這些資訊,並連線到 SQL Server。
另外值得一提的是,『ODBC資料來源』中,有所謂的『使用者來源』和『系統來源』,
這指的是這個資料庫設定,是只有使用者看得到、用得到的,還是整個系統(所有使用者)都看得到、用得到。

而在 unixODBC 上也是一樣的,只是這些設定儲存在設定檔中,
以『系統來源』來說,所有使用者都能使用的 ODBC 設定,設定檔是 /etc/odbc.ini;
以『使用者來源』來說,只有自己能使用的 ODBC 設定,設定檔是 ~/.odbc.ini。

設定檔範例如下:
[MySQL-Optical_Disc_Manage]
Description = MySQL Optical_Disc_Manage
Driver = MySQL
Server = 192.168.1.6
Database = Optical_Disc_Manage
Port = 3306


格式說明如下:
[ODBC連線名稱]
Description = 這個連線的描述
Driver = Driver的類型,這部分參考 /etc/odbcinst.ini
Server = SQL Server IP
Database = 資料庫名稱
Port = 連接埠埠號


而 odbcinst.ini 正常來說,Driver 都要提供範例,以這邊 MySQL 為例,它的內容如下:
[MySQL]
Description = MySQL driver
Driver = /usr/lib/odbc/libmyodbc.so
Setup = /usr/lib/odbc/libodbcmyS.so
CPTimeout =
CPReuse =


注意到『[MySQL]』,這就是我們上面 odbc.ini 中提到的 Driver 欄位要填的內容。

上面說了一堆之後,我們可以發現到 unixODBC 設定實在有夠麻煩,尤其是 odbc.ini 的設定,
有沒有類似 Windows 上『ODBC資料來源』那樣的 GUI 設定介面呢?

有~我們前面安裝的套件『unixodbc-bin』,裡面就有提供這樣的工具給我們使用,
unixODBC 有 2 個圖形化介面工具可以使用,分別是:
ODBCConfig
DataManager

其中最重要、好用的,就是 ODBCConfig,如下執行:
# ODBCConfig

執行後會看到一個類似 Windows 上『ODBC資料來源』的 GUI 視窗。

如果前面已經有按照說明設定過了,
以我來說,我將上面 odbc.ini 的設定存成 ~/.odbc.ini,
那麼進入 ODBCConfig 介面後,我會在『User DSN』分頁看到這個設定。

目前,中文似乎還有問題,如何指定編碼目前我還不會。
==============================================

沒有留言: