目錄
什麼是 ODBC?
ODBC(Open Database Connectivity,開放式資料庫連接) 是一套標準化的資料庫存取 API,由微軟於 1992 年提出,奠基於 SQL/CLI 標準。
核心理念:應用程式只對一套標準介面寫程式,換不同資料庫只需換對應的驅動程式(driver),程式碼幾乎不動。
沒有 ODBC:每種資料庫各有自己的 API → 換 DB 就要改寫存取程式
有 ODBC: 程式對 ODBC 標準 API 寫一次 → 換 DB 只換 driver
核心特點
- 資料庫無關:同一套程式可連 MySQL、PostgreSQL、SQL Server、Oracle…
- 以驅動抽象差異:各家資料庫的差異封裝在各自的 ODBC driver 中
- 語言層級為 C:ODBC 本身是 C 風格的 API,多數語言透過綁定使用
- 廣泛內建:BI 工具、Excel、報表軟體、ETL 工具普遍支援
為什麼需要 ODBC?
沒有統一介面的問題
每種資料庫都有自己的原生 client 程式庫與 API。若應用程式直接呼叫原生 API:
- 換資料庫 → 大量改寫存取層
- 同時支援多種資料庫 → 要維護多套程式碼
- 工具軟體(Excel、Tableau)無法預先支援所有資料庫
ODBC 的解法
在應用程式與資料庫之間插入一層標準抽象:
應用程式 ──呼叫標準 ODBC API──► [ODBC 層] ──各家 driver──► 各種資料庫
應用程式只認 ODBC,不必認得每種資料庫的細節;資料庫廠商只要提供符合 ODBC 的 driver,就能被所有支援 ODBC 的軟體使用。
ODBC 是「介面標準」,不是某個資料庫,也不是程式庫——它定義「該怎麼呼叫」,實際連線由 driver 完成。
架構分層
ODBC 由四層組成:
┌─────────────────────────────┐
│ 應用程式(Application) │ 呼叫標準 ODBC API
├─────────────────────────────┤
│ 驅動管理器(Driver Manager) │ 載入/調度正確的 driver
├─────────────────────────────┤
│ ODBC 驅動程式(Driver) │ 把 ODBC 呼叫翻譯成該 DB 的協定
├─────────────────────────────┤
│ 資料來源(Data Source / DB) │ 實際的資料庫
└─────────────────────────────┘
| 層 | 角色 |
|---|---|
| 應用程式 | 透過 ODBC API 下 SQL、取結果 |
| Driver Manager | 依 DSN / 連線字串找到並載入對應 driver;Windows 內建,Linux/macOS 常用 unixODBC |
| Driver | 各資料庫廠商提供,將標準呼叫轉成資料庫專屬協定 |
| 資料來源 | 真正的資料庫(本機或遠端) |
核心概念
Driver(驅動程式)
各資料庫專屬的實作,負責把 ODBC 標準呼叫翻成該資料庫聽得懂的協定。例如:
MySQL ODBC Driver、PostgreSQL ODBC Driver (psqlODBC)、ODBC Driver 18 for SQL Server
Driver Manager(驅動管理器)
居中調度:應用程式呼叫的是 Driver Manager,由它依設定載入正確的 driver。
- Windows:作業系統內建(
odbcad32.exe管理) - Linux / macOS:通常安裝 unixODBC(或 iODBC)
DSN(Data Source Name,資料來源名稱)
把「連哪個資料庫、用哪個 driver、主機/帳密等」封裝成一個具名設定,應用程式只需引用名稱:
DSN=MyDatabase ← 背後已設定好 driver、host、port、db、user…
也可以不用 DSN(DSN-less),直接在連線字串中寫全部資訊。
DSN 的三種類型
| 類型 | 範圍 | 儲存位置 |
|---|---|---|
| User DSN | 只對「建立它的使用者」可見 | 使用者設定區(Windows 登錄檔 HKEY_CURRENT_USER) |
| System DSN | 對該機器「所有使用者 / 服務」可見 | 系統設定區(HKEY_LOCAL_MACHINE) |
| File DSN | 存成 .dsn 檔,可分享 / 攜帶 |
檔案系統 |
- 服務 / 背景程式通常需要 System DSN(因為不在特定使用者 session 下執行)
- File DSN 適合團隊共用同一份連線設定
設定方式
Windows
用內建工具 ODBC 資料來源管理員(odbcad32.exe)以 GUI 新增 DSN、選 driver、填連線資訊、測試連線。
注意 32 位元 / 64 位元有各自的
odbcad32,driver 與應用程式的位元數需一致,否則會出現「找不到 driver」。
Linux / macOS(unixODBC)
靠兩個設定檔:
# /etc/odbcinst.ini —— 註冊「有哪些 driver」
[PostgreSQL]
Description = PostgreSQL ODBC driver
Driver = /usr/lib/x86_64-linux-gnu/odbc/psqlodbcw.so
# /etc/odbc.ini (或 ~/.odbc.ini)—— 定義「DSN」
[MyPg]
Driver = PostgreSQL
Servername = localhost
Port = 5432
Database = mydb
測試連線(unixODBC 附帶的工具):
isql -v MyPg myuser mypassword
連線字串
連線字串是「即時、不依賴預設 DSN」的連線描述,常見兩種風格:
引用 DSN
DSN=MyPg;UID=myuser;PWD=secret;
DSN-less(直接指定 driver 與參數)
Driver={ODBC Driver 18 for SQL Server};Server=localhost,1433;Database=mydb;UID=sa;PWD=secret;Encrypt=yes;
- DSN-less 不必事先在系統登記 DSN,攜帶性高、常用於應用程式設定檔
- 缺點是連線資訊(含 driver 名稱、參數)散落在程式 / 設定中
實戰範例
Python(pyodbc)
pyodbc 是 Python 最常用的 ODBC 綁定:
import pyodbc
# DSN-less 連線字串
conn = pyodbc.connect(
"Driver={PostgreSQL};"
"Server=localhost;Port=5432;"
"Database=mydb;Uid=myuser;Pwd=secret;"
)
cursor = conn.cursor()
cursor.execute("SELECT id, name FROM users WHERE id = ?", 1) # 參數化查詢
for row in cursor.fetchall():
print(row.id, row.name)
conn.close()
引用已設定的 DSN
conn = pyodbc.connect("DSN=MyPg;UID=myuser;PWD=secret")
參數化查詢用
?佔位符,避免 SQL 注入——這與其他資料存取層的安全原則一致。
ODBC vs JDBC vs OLE DB vs 原生驅動
| 項目 | ODBC | JDBC | OLE DB | 原生驅動 |
|---|---|---|---|---|
| 介面風格 | C API,標準 | Java API | COM(微軟) | 各家自訂 |
| 主要對象 | 跨語言 / 工具 | Java 應用 | Windows / .NET 生態 | 特定資料庫 |
| 資料庫無關 | 是 | 是 | 是(偏微軟) | 否 |
| 典型場景 | BI、Excel、ETL、Python pyodbc | Java 後端 | 舊版 Windows 應用 | 追求最佳效能 / 特殊功能 |
| 效能 | 多一層抽象 | 多一層抽象 | 多一層抽象 | 通常最快 |
重點
- JDBC 可視為「Java 世界的 ODBC」:理念相同,但綁定在 JVM。早期有 JDBC-ODBC Bridge,現已淘汰。
- OLE DB / ADO.NET 是微軟後續推的資料存取技術,在 .NET 生態較常見;ODBC 仍是最通用的跨平台選項。
- 原生驅動(如 MySQL connector、libpq)少一層抽象、效能與功能最完整,但綁死特定資料庫。
- 取捨:要通用 / 工具相容選 ODBC;要極致效能 / 專屬功能選原生驅動。
常見問題
問題 1:ODBC 是資料庫嗎?
不是。ODBC 是存取資料庫的標準介面,本身不存資料。實際連線由各資料庫的 ODBC driver 完成。
問題 2:DSN 一定要設嗎?
不一定。可用 DSN-less 連線字串直接寫明 driver 與參數,免去事先登記 DSN,攜帶性更好。
問題 3:常見的「找不到 driver / data source name not found」怎麼解?
多半是:driver 未安裝、DSN 名稱拼錯、或位元數不符(64 位元應用配 32 位元 driver)。Windows 要確認用對 odbcad32;Linux 檢查 odbcinst.ini / odbc.ini 路徑與 driver .so 是否存在。
問題 4:ODBC 和 JDBC 該用哪個?
看技術棧。Java 應用用 JDBC;非 Java(Python、C/C++、BI 工具、Excel)或需跨語言通用,用 ODBC。
問題 5:透過 ODBC 連資料庫會比較快嗎?
不會,通常反而略慢。ODBC 的價值是「通用性」而非速度——它在程式與資料庫之間多了一層抽象:
透過 ODBC:程式 → ODBC API → Driver Manager → ODBC Driver → 資料庫(多一層轉譯)
原生驅動: 程式 → 原生驅動(libpq / psycopg2 …)→ 資料庫(直接講 DB 協定)
效能排序大致是 原生驅動 ≥ ODBC。但差距在多數應用上感受不明顯(瓶頸通常在查詢本身、索引、網路,而非這層)。
- 選 ODBC:要一套程式連多種資料庫、或用 Excel / Tableau / Power BI 這類只認 ODBC 的工具
- 選原生驅動:只連固定一種資料庫、在意效能或要用資料庫專屬功能、希望部署簡單
問題 6:用 ODBC 需要在機器上裝 driver 嗎?裝在哪一台?
需要,而且要裝在執行程式的那台機器(不是資料庫那台)。因為實際去連線、翻譯協定的就是 driver 本身;沒有它,Driver Manager 會回報 data source name not found and no default driver specified。
| 平台 | 需安裝 |
|---|---|
| Windows | 對應資料庫的 ODBC driver(Driver Manager 系統內建) |
| Linux / macOS | unixODBC(Driver Manager)+ 對應 ODBC driver(.so) |
對比 JDBC:JDBC driver 是一個
.jar,跟著應用程式打包,不必在 OS 層另外安裝——這也是 Java 生態偏好 JDBC、較少用 ODBC 的原因之一。
總結
核心要點
- ODBC 是標準化的資料庫存取 API:一套介面、換 driver 即可連不同資料庫
- 架構四層:應用程式 → Driver Manager → Driver → 資料來源
- DSN 把連線設定具名封裝(User / System / File 三型);也可用 DSN-less 連線字串
- 設定:Windows 用
odbcad32,Linux/macOS 用 unixODBC(odbcinst.ini+odbc.ini) - JDBC 是 Java 版的同類;原生驅動效能最好但綁死資料庫
- 通用性選 ODBC,極致效能選原生驅動
快速參考
| 名詞 | 說明 |
|---|---|
| Driver Manager | 載入並調度 driver(Windows 內建 / unixODBC) |
| Driver | 各 DB 專屬實作,翻譯 ODBC 呼叫 |
| DSN | 具名連線設定(User / System / File) |
| DSN-less | 連線字串直接寫 driver 與參數 |
| pyodbc | Python 的 ODBC 綁定 |
| 場景 | 建議 |
|---|---|
| Java 應用 | JDBC |
| Python / 跨語言 / BI 工具 | ODBC |
| 極致效能 / 專屬功能 | 原生驅動 |
| 背景服務連線 | System DSN |
建立日期:2026-06-18