Microsoft 官方未提供 Linux 原生 SQL Server 驅動 (早期版本),FreeTDS 成為開源社群事實標準。本文涵蓋 FreeTDS 0.64 版編譯安裝、配置驗證、C/C++ 兩種開發模式 (官方範例 / 直接呼叫 DB-Library API),助你在 Linux 上穩健連接 SQL Server / Sybase。
# 下載與解壓
wget ftp://ftp.freetds.org/pub/freetds/stable/freetds-stable.tgz
tar -zxvf freetds-stable.tgz
cd freetds-0.64
# 配置安裝路徑 (建議 /usr/local/freetds)
./configure --prefix=/usr/local/freetds
make
sudo make install
/usr/local/freetds/bin/tsql -H 2.2.2.2 -p 1433 -U test -P test
# 參數說明:
# -H Server IP
# -p Port (預設 1433)
# -U Username
# -P Password
成功進入 `1>` 提示符即表示網路層、驅動層、認證層全通。
cd /path/to/freetds-0.64/src/apps
make clean && make
# 產出可執行檔,可直接測試連線、查詢流程
testSybase.c 完整範例:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <sybfront.h>
#include <sybdb.h>
int main(void) {
char szUsername[32] = "test";
char szPassWord[32] = "test";
char szDBName[32] = "test";
char szServer[32] = "2.2.2.2:1433";
// 1. 初始化 DB-Library
dbinit();
// 2. 建立登入記錄
LOGINREC *loginrec = dblogin();
DBSETLUSER(loginrec, szUsername);
DBSETLPWD(loginrec, szPassWord);
// 3. 開啟連線
DBPROCESS *dbprocess = dbopen(loginrec, szServer);
if (dbprocess == FAIL) {
printf("Connect MSSQL SERVER fail\n");
return 0;
}
printf("Connect MSSQL SERVER success\n");
// 4. 選擇資料庫
if (dbuse(dbprocess, szDBName) == FAIL) {
printf("Open database fail\n");
} else {
printf("Open database success\n");
}
// 5. 送出查詢
dbcmd(dbprocess, "SELECT ID, BeginTime, Description FROM Alarms");
if (dbsqlexec(dbprocess) == FAIL) {
printf("Query Alarms table error\n");
}
// 6. 綁定結果欄位
DBINT result_code;
char szID[1024], szBeginTime[1024], szDescription[1024];
int rows = 0;
while ((result_code = dbresults(dbprocess)) != NO_MORE_RESULTS) {
if (result_code == SUCCEED) {
dbbind(dbprocess, 1, CHARBIND, (DBINT)0, (BYTE*)szID);
dbbind(dbprocess, 2, CHARBIND, (DBCHAR)0, (BYTE*)szBeginTime);
dbbind(dbprocess, 3, CHARBIND, (DBCHAR)0, (BYTE*)szDescription);
while (dbnextrow(dbprocess) != NO_MORE_ROWS) {
printf("ID=%s\n", szID);
printf("BeginTime=%s\n", szBeginTime);
printf("Description=%s\n", szDescription);
}
}
}
// 7. 關閉連線
dbclose(dbprocess);
return 0;
}
編譯指令:
gcc -o testSybase testSybase.c /usr/local/freetds/lib/libsybdb.a -I/usr/local/freetds/include
| 現象 | 原因 | 解決 |
|---|---|---|
| tsql 連線成功,但 C 程式 `dbopen` 失敗 | freetds.conf 未設定 server 區塊、或 TDS 版本不匹配 | 編輯 /usr/local/freetds/etc/freetds.conf,加入 `[global] tds version = 7.3` (SQL 2008+) 或 `8.0` (SQL 2012+),並定義 server 區塊 |
| 中文亂碼 | 字元集轉換錯誤 | freetds.conf 設定 `client charset = UTF-8`;確認資料庫欄位排序規則支援 Unicode (如 `Chinese_PRC_CI_AS`) |
| 大量資料查詢記憶體暴增 | `dbnextrow` 預設緩衝全結果集 | 使用 `dbsetopt(dbprocess, DBBUFFER, "0")` 關閉緩衝,逐列處理 |
| 連線閒置被防火牆/Proxy 斷開 | TCP Keepalive 未生效 | 啟用 OS 層 `tcp_keepalive_time`,或應用層定期發送 `SELECT 1` 心跳 |
FreeTDS 是 Linux 連接 SQL Server 的開源基石,掌握其安裝、配置、API 呼叫細節,能在遷移、異構整合、舊系統維護等場景游刃有餘。