ODBC 開放式資料庫連接完全指南

理解 ODBC 標準資料庫存取介面:架構分層、DSN、連線字串設定,以及與 JDBC / OLE DB 的差異


目錄


什麼是 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 DriverPostgreSQL 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 用 unixODBCodbcinst.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

🔗相關文章